Docker常用的命令
1、查看镜像
1.1、查询镜像
[root@k8s-master ~]# docker images
1.2、查询运行的镜像
# 查看正在运行的镜像 [root@k8s-master ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 查看所有运行或运行过的镜像 [root@k8s-master ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6ab7d6d28da1 hello-world "/hello" 8 seconds ago Exited (0) 7 seconds ago busy_spence
1.3、格式化输出
Placeholder Description
.ID Image ID
.Repository Image repository
.Tag Image tag
.Digest Image digest
.CreatedSince Elapsed time since the image was created
.CreatedAt Time when the image was created
.Size Image disk size
[root@k8s-master ~]# docker images --format '{{.Repository}} - {{.ID}}'
1.3.1、格式化取json参数
[root@k8s-master ~]# docker inspect --format '{{.NetworkSettings.IPAddress}}' c996ab2919e 172.7.5.2
1.4、查询镜像详细信息
[root@k8s-master ~]# docker inspect e6ea68648f0c
1.5、搜索镜像
[root@k8s-master ~]# docker search centos
2、下载或运行镜像
2.1、下载镜像
[root@k8s-master ~]# docker pull hello-world
2.2、运行镜像
2.2.1、简单运行镜像
[root@k8s-master ~]# docker run hello-world
2.2.2、运行执行命令
[root@k8s-master ~]# docker run -it centos ping www.baidu.com
2.2.3、后台运行镜像
[root@k8s-master ~]# docker run -d nginx
2.2.4、无痕运行镜像
[root@k8s-master ~]# docker run -d --rm nginx
2.2.5、运行镜像定义启动的名字
[root@k8s-master ~]# docker run -d --name cyc-nginx --rm nginx
2.3、停止镜像
[root@k8s-master ~]# docker stop 0c9c7049c715
2.4、查询运行的日志
[root@k8s-master ~]# docker logs e1801a89fa8a
2.5、进入运行的容器中
[root@k8s-master ~]# docker exec -it e1801a89fa8a bash
3、镜像导入、导出、提交
3.1、导出镜像
[root@k8s-master ~]# docker save registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.0 > kube-apiserver_v1.26.0.tgz
3.2、导入镜像
root@k8s-master ~]# docker load <kube-apiserver_v1.26.0.tgz
3.3、提交镜像
[root@k8s-master ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b2a9e8f4b64 centos "bash" 15 seconds ago Exited (0) 3 seconds ago affectionate_rhodes [root@k8s-master ~]# docker commit -a 'cyc_author' -m 'my centos ping' 0b2a9e8f4b64 cyc_centos_ping:v1 sha256:1f7ec9353fe0323c1afd66863f8175917b678cc1e1c10d5bf82fee579bcfedb4 [root@k8s-master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE cyc_centos_ping v1 1f7ec9353fe0 7 seconds ago 231MB centos latest 5d0da3dc9764 16 months ago 231MB
4、删除与参数查看
4.1、删除运行记录
4.1.1、单个删除运行记录镜像
[root@k8s-master ~]# docker rm 4ff2d3122477
4.1.2、批量删除运行记录镜像
[root@k8s-master ~]# docker rm `docker ps -aq`
4.2、删除镜像
4.2.1、单个删除镜像
[root@k8s-master ~]# docker rmi feb5d9fea6a5
4.2.1、批量删除镜像
[root@k8s-master ~]# docker rmi `docker ps -qa`
4.3、参数查看
4.3.1、top查询进程相关
[root@k8s-master ~]# docker top c996ab2919e1 UID PID PPID C STIME TTY TIME CMD root 40241 40221 0 09:55 ? 00:00:00 nginx: master process nginx -g daemon off; 101 40293 40241 0 09:55 ? 00:00:00 nginx: worker process 101 40294 40241 0 09:55 ? 00:00:00 nginx: worker process
4.3.2、stats查询程序运行的参数
[root@k8s-master ~]# docker stats c996ab2919e1 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS c996ab2919e1 trusting_antonelli 0.00% 1.973MiB / 3.682GiB 0.05% 656B / 0B 0B / 16.4kB 3
5、DockerFile
5.1、FROM
构建镜像基于哪个镜像,如:
FROM nginx
5.2、MAINTAINER
镜像维护者姓名或邮箱地址,如:
MAINTAINER cyc@test.com
5.3、RUN
构建镜像时运行的指令,即运行的命令。如: RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
5.4、ADD
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下: ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。 ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
5.5、COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。 格式: COPY [--chown=<user>:<group>] <源路径1>... <目标路径> COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"] [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。 <源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如: COPY hom* /mydir/ COPY hom?.txt /mydir/ <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
5.6、WORKDIR
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
格式:
WORKDIR <工作目录路径>
5.7、VOLUME
VOLUME 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。 作用: 避免重要的数据,因容器重启而丢失,这是非常致命的。 避免容器不断变大。 格式: VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径> 在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
5.8、EXPOSE
EXPOSE 仅仅只是声明端口。 作用: 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。 格式: EXPOSE <端口1> [<端口2>...]
5.9、CMD
CMD 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同: CMD 在docker run 时运行。 RUN 是在 docker build。 作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。 格式: CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数 推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
5.9、ENV
ENV 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。 格式: ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... 以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用: ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
5.10、ENTRYPOINT
ENTRYPOINT 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。 但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。 优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。 注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。 格式: ENTRYPOINT ["<executeable>","<param1>","<param2>",...] 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。 示例: 假设已通过 Dockerfile 构建了 nginx:test 镜像: FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参 1、不传参运行 $ docker run nginx:test 容器内会默认运行以下命令,启动主进程。 nginx -c /etc/nginx/nginx.conf 2、传参运行 $ docker run nginx:test -c /etc/nginx/new.conf 容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件) nginx -c /etc/nginx/new.conf
5.11、简单实践
# 创建目录 [root@k8s-master opt]# mkdir /opt/my_nginx_dockerfile # 创建Dockerfile文件 [root@k8s-master ~]# cat > /opt/my_nginx_dockerfile/Dockerfile << 'EOF' FROM nginx RUN echo "test nginx " >/usr/share/nginx/html/index.html EOF # 编译镜像 [root@k8s-master my_nginx_dockerfile]# docker build -t my_nginx:v1 . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM nginx ---> 605c77e624dd Step 2/2 : RUN echo "test nginx " >/usr/share/nginx/html/index.html ---> Running in 69d84a0d4355 Removing intermediate container 69d84a0d4355 ---> 2e5504e8e1e8 Successfully built 2e5504e8e1e8 Successfully tagged my_nginx:v1 # 测试镜像 [root@k8s-master my_nginx_dockerfile]# docker run -p 8080:80 my_nginx:v1 # 访问测试 http://192.168.10.9:8080/
6、打包镜像
6.1、实战1-打包python web项目
6.1.1、编写web代码
# -*- coding: utf-8 -*- """ File Name : test1 Description : Author : Administrator date : 2023/1/1 Change Activity : 2023/1/1: """ import asyncio import sys import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Tornado Web Hello world...") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) async def main(port): app = make_app() app.listen(port) await asyncio.Event().wait() if __name__ == "__main__": print('start tornedo web server...') port = 8888 if len(sys.argv) == 2: port = sys.argv[1] asyncio.run(main(port))
6.1.2、编写Dockerfile
cat > Dockerfile <<'EOF' FROM python:latest RUN pip3 install tornado==6.2 COPY tornado_web_test.py /opt WORKDIR /opt EXPOSE 8888 CMD ["python3","tornado_web_test.py"] EOF
6.1.3、编译镜像
[root@k8s-master learn_docker]# docker build -t my_tornado_web:v1 .
6.1.4、运行镜像和检查
[root@k8s-master learn_docker]# docker run -p 8888:8888 -d my_tornado_web:v1 [root@k8s-master learn_docker]# curl http://192.168.10.9:8888/ Tornado Web Hello world...
6.2、实战2-修改[实战1]再打包
6.2.1、显示效果
把代码修改为显示:
First Tornado Web Hello world...
6.2.2、修改镜像的安装源
# 注意:如果需要导入公钥的话,需要把公钥复制如下,进行导入 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys '3B4FE6ACC0B21F32' cat > /etc/apt/sources.list <<'EOF' deb https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse EOF 参考阿里云如下:https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3e221b11PLEs6l
6.2.3、将原来运行的镜像修改好后打包
[root@k8s-master learn_docker]# docker ps -a | grep b42139585960 b42139585960 my_tornado_web:v1 "python3 tornado_web…" About an hour ago Exited (137) 4 minutes ago heuristic_shamir [root@k8s-master learn_docker]# docker commit -a 'cyc_author' -m 'v2 version' b42139585960 my_tornado_web:v2
6.2.4、运行并且查看效果
# 查看镜像ID [root@k8s-master learn_docker]# docker images | grep v2 my_tornado_web v2 aaf3454c59b4 3 minutes ago 1.02GB # 运行镜像 [root@k8s-master learn_docker]# docker run -d -p 8888:8888 my_tornado_web:v2 # 访问测试 [root@k8s-master learn_docker]# curl http://192.168.10.9:8888/ First Tornado Web Hello world...