docker学习
docker常用命令
容器操作命令
查看容器状态
查看正在运行的容器
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
镜像操作命令
images查看本机镜像列表
docker images
pull从远程镜像仓库中下载一个新的镜像到本地
docker pull ubuntu:13.10
search搜索镜像
docker search httpd
rmi删除镜像
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是镜像的名称和版本
.是构建时需要打包的路径,相当于构建上下文。这行命令会把当前目录下的所有文件都打包到镜像中。所以镜像中不要放没有用的文件
docker授权命令
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用