查看正在运行的容器
docker ps -a
第一列容器id,停止容器会用到
第二列IMAGE是这个容器所使用的镜像
第三列COMMAND是这个容器启动时附带的命令
第四列CREATED是代表这个容器什么时候创建的
第五列代表这个容器的状态,up就是运行,Exited退出
第六列PORTS代表这个容器使用的网络端口,一般web服务器会用到,上面几个例子中都没用到端口
docker run ubuntu:latest /bin/echo "hello world"
run的意思是使用ubuntu的latest版本镜像创建一个新容器,然后运行/bin/echo这个程序,打印hello world
当然也可以直接执行docker run ubuntu:latest就会什么也不做自动退出
docker run -itd --name ubuntuTest ubuntu:latest /bin/bash
也可以写成
docker run -i -t -d --name ubuntuTest ubuntu:latest /bin/bash
-i:交互式操作,因为我们启动容器后运行了/bin/bash所以需要交互
-t: 显示一个终端,如果启动了/bin/bash,但是没有用-t参数,输出将会不可见,就会是下面这个效果
-d: 将容器后台运行,如果不指定-d,则当前终端退出,docker容器就会自动退出
–name: 指定当前容器的名字,也可以不写,主要在一个镜像版本启动了多个的时候可能需要指定吧
没有使用-t的效果
docker start b750bbbcfd88
b750bbbcfd88是容器ID,用docker ps -a命令可以看到
docker start和run的区别,run会使用镜像创建一个新容器,start会用之前创建的容器来运行。
举个例子,现在要用docker启动一个web服务器实例,指定了端口8080,如果现在需要使用这个镜像启动另一个web服务器实例,不能指定端口8080了,所以就需要使用docker run命令。重新指定一个端口号来启动。
重启一个正在运行的容器,可能这个容器发生了内存溢出,或者cpu满了
docker restart <容器 ID>
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入
docker attach b750bbbcfd88
或者
docker exec b750bbbcfd88
b750bbbcfd88是容器ID,用docker ps -a命令可以看到
exec和attach的区别就是,使用attach进入容器退出后,容器会停止运行,exec不会停止运行
docker stop b750bbbcfd88
b750bbbcfd88是容器ID,用docker ps -a命令可以看到
docker export 1e560fca3906 > ubuntu.tar
上面的命令会将容器快照导入ununtu.tar文件中
从导出的快照文件中导入
cat ubuntu.tar | docker import - ubuntu:v1
从网络中导入
docker import http://example.com/exampleimage.tgz example/imagerepo
删除单个容器
docker rm -f 1e560fca3906
删除所有处于终止状态的容器
docker container prune
查看容器标准输入输出日志
docker logs 1e560fca3906
查看容器内运行的进程
docker top 1e560fca3906
查看容器配置信息
docker inspect 1e560fca3906
容器重命名
docker rm name1 name2
docker images
docker pull ubuntu:13.10
docker search httpd
docker rmi httpd
当我们的镜像版本比较老时,可以进行更新
首先使用镜像创建一个容器,并启动一个命令行
docker run -t -i webapp:v1 /bin/bash
如果镜像中包含了node服务
可以使用npm install 进行更新。
更新完成之后在命令行中使用exit停止容器
然后使用commit来提交容器副本,-m是本次更新的描述信息,-a是author的意思。e218edb10161是刚才停止的那个容器ID,webapp:v2是新的镜像名称
docker commit -m="更新了node.js版本" -a="bugggget" e218edb10161 webapp:v2
构建镜像需要创建一个Dockerfile文件,然后在这个文件中指定镜像中需要包含的内容。
如果我们需要构建一个镜像,包含Nginx,redis
可以在Dockerfile中写入如下内容
FROM nginx
LABEL image.authors="bugggget"
ENV BUILD_DESC 镜像开始构建,这是一个本地构建的nginx镜像
ENV RUN_DESC 容器启动
RUN echo $BUILD_DESC > /usr/share/nginx/html/index.html \
&& RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
COPY ./ /usr/tom/tmp
VOLUME ["/mnt","/user/test"]
CMD echo $RUN_DESC
ENTRYPOINT ["nginx", "-c", "/etc/nginx/nginx.conf"]
注意/usr/share/nginx/html/index.html是在容器内的路径,不是当前主机上的路径,一般不要去修改他
FROM:docker镜像是分层的,FROM是这个镜像的基础镜像
LABEL:添加镜像的一些描述信息
ENV:定义的环境变量,Dockerfile和容器运行时都可以使用$来引用这个变量
RUN:只有在build时才会运行,每次运行RUN命令的时候都会新增一层镜像。所以为了减少分层次数,上面使用了&&符号来连接
COPY:将相对当前Dockerfile上下文的文件复制到容器中对应的目录下,如果对应的目录不存在则会创建。这里是把本机上当前目录下所有文件都复制到了容器中的/usr/tom/tmp目录下(copy注意了,src尽量写当前路径,desc应该是绝对路径)
VOLUME:设置文件挂载点,也就是将当前主机中的/mnt目录和容器中/user/test这个目录关联起来,后续/user/test中的任何变动都会同步到主机的/mnt目录下。可以用于日志文件保存,防止容器关闭导致日志文件流失。也可以在运行时使用-v来指定挂载点 -v /mnt:/usr/test
CMD:每次容器启动时都会执行的命令或者脚本,如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。如果命令带了参数,可以通过在docker run时修改cmd的参数
ENTRYPOINT:功能和CMD类似,但是参数不可变
RUN和CMD,ENTRYPOINT的区别
RUN表示在构建过程中执行的命令,如果RUN命令失败,那么镜像就会创建失败。所以一定不要在RUN中写程序启动的命令
CMD和ENTRYPOINT表示在运行过程中执行的命令,在build过程中不会被执行
Dockerfile文件编写完成之后,执行build命令
docker build -t nginxtest:v1 .
nginxtest:v1是镜像的名称和版本
.是构建时需要打包的路径,相当于构建上下文。这行命令会把当前目录下的所有文件都打包到镜像中。所以镜像中不要放没有用的文件
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用