Docker的常用命令

帮助命令

  1. docker version # 显示docker的版本信息
  2. docker info # 显示docker得系统信息,包括镜像和容器得数量
  3. docker 命令 --help #万能命令

镜像命令

docker images 查看所有本地的主机上的镜像

  1. [root@iZbp17prsnk785pvagnbe5Z ~]# docker image
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. redis latest aa4d65e670d6 2 months ago 105MB
  4. #解释
  5. REPOSITORY 镜像的仓库源
  6. TAG 镜像的标签
  7. IMAGE ID 镜像的id
  8. CREATED 镜像的创建时间
  9. SIZE 镜像的大小
  10. #可选项
  11. -a, --all # 列出所有的镜像
  12. -q, --quiet # 只显示镜像的id

docker search 搜索镜像

  1. [root@iZbp17prsnk785pvagnbe5Z ~]# docker search mysql
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. mysql MySQL is a widely used, open-source relation 11490 [OK]
  4. mariadb MariaDB Server is a high performing open sou 4357 [OK]
  5. #可选项
  6. --filter=STARS=3000 搜索出来的镜像的STARS大于3000

docker pull 下载镜像

  1. #下载镜像 docker pull 镜像名[:tag]
  2. [root@iZbp17prsnk785pvagnbe5Z ~]# docker pull mysql

docker rmi 删除镜像

  1. [root@iZbp17prsnk785pvagnbe5Z ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. redis latest aa4d65e670d6 2 months ago 105MB
  4. nginx latest 08b152afcfae 2 months ago 133MB
  5. mysql latest 95db2e2bd882 2 months ago 514MB
  6. centos latest 300e315adb2f 9 months ago 209MB
  7. # 根据指定id删除镜像
  8. [root@iZbp17prsnk785pvagnbe5Z ~]# docker images -f 镜像id 镜像id ...
  9. # 删除所有镜像
  10. [root@iZbp17prsnk785pvagnbe5Z ~]# docker images -f ${docker images -aq}

容器命令

拉取镜像

  1. docker pull centos

新建容器并启动

  1. docker run [可选参数] 镜像IMAGE ID|镜像REPOSITORY
  2. # 参数说明
  3. --name="Name" 容器名字
  4. -d 后台方式运行
  5. -it 使用交互方式运行,进入容器查看内容
  6. -p 指定容器的端口 -p 8080:8080
  7. -p ip:主机端口:容器端口
  8. -p 主机端口:容器端口(常用)
  9. -p 容器端口
  10. 容器端口
  11. -P 随机指定端口
  12. [root@iZbp17prsnk785pvagnbe5Z ~]# docker images -a
  13. REPOSITORY TAG IMAGE ID CREATED SIZE
  14. redis latest aa4d65e670d6 2 months ago 105MB
  15. nginx latest 08b152afcfae 2 months ago 133MB
  16. mysql latest 95db2e2bd882 2 months ago 514MB
  17. centos latest 300e315adb2f 9 months ago 209MB
  18. # 启动并进入容器
  19. [root@iZbp17prsnk785pvagnbe5Z ~]# docker run -it centos /bin/bash
  20. [root@c9c84bcef44c /]# ls #查看容器内的centos
  21. bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
  22. # 从容器中退回主机
  23. [root@c9c84bcef44c /]# exit
  24. exit
  25. # 退出容器
  26. exit #直接容器停止退出
  27. ctrl + p + q #容器不停止退出

列出运行中的容器

  1. docker ps 命令
  2. # 参数说明
  3. -a 列出当前正在运行的容器+历史运行过的容器
  4. -n=? 显示最近创建的容器
  5. -q 只显示容器id
  6. [root@iZbp17prsnk785pvagnbe5Z /]# docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. [root@iZbp17prsnk785pvagnbe5Z /]# docker ps -a
  9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  10. c9c84bcef44c centos "/bin/bash" 6 minutes ago Exited (0) 3 minutes ago recursing_ptolemy
  11. # 模糊查询启动的容器
  12. [root@iZbp17prsnk785pvagnbe5Z /]# docker ps -a |grep cen
  13. 3f9faf742893 centos "/bin/bash -c 'while…" 3 minutes ago Up 3 minutes centos

删除容器

  1. docker rm 容器id #删除指定容器,但不能删除运行中的容器
  2. docker rm -f $(docker ps -aq) #删除所有的容器
  3. docker ps -a -q|xargs docker rm #删除所有容器

启动和停止容器的操作

  1. docker start 容器id #启动容器
  2. docker restart 容器id #重启容器
  3. docker stop 容器id #停止容器
  4. docker kill 容器id #强制停止容器

常用其他命令

后台启动容器

  1. # 命令
  2. [root@iZbp17prsnk785pvagnbe5Z /]# docker run -d centos
  3. # docker容器使用后台运行,就必须要有一个前台进程,如果没有就自动停止

查看日志

  1. docker logs -f -t --tail 1000 容器id
  2. # 编写一个shell脚本打印日志
  3. [root@iZbp17prsnk785pvagnbe5Z /]# docker run -d --name=centos centos /bin/bash -c "while true;do echo brandon;sleep 2;done"
  4. [root@iZbp17prsnk785pvagnbe5Z /]# docker ps
  5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6. 3f9faf742893 centos "/bin/bash -c 'while…" 4 seconds ago Up 3 seconds centos
  7. [root@iZbp17prsnk785pvagnbe5Z /]# docker logs -f centos
  8. brandon
  9. brandon
  10. [root@iZbp17prsnk785pvagnbe5Z /]# docker logs -f -t --tail 5 centos
  11. 2021-10-03T04:19:47.165048409Z brandon
  12. 2021-10-03T04:19:49.168202492Z brandon
  13. 2021-10-03T04:19:51.171283772Z brandon
  14. 2021-10-03T04:19:53.174755121Z brandon
  15. 2021-10-03T04:19:55.177780172Z brandon

查看容器中的进程信息

  1. docker top 容器id

查看镜像元数据

  1. docker inspect 容器id

进入当前正在运行的容器

  1. # 我们通常容器都是使用后台方式运行的,需要进入容器修改一些配置
  2. # 命令
  3. docker exec -it 容器id /bin/bash
  4. [root@iZbp17prsnk785pvagnbe5Z /]# docker exec -it centos /bin/bash
  5. [root@3f9faf742893 /]# ls
  6. bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

从容器内拷贝文件到主机上

  1. docker cp 容器id:容器内路径 目的的主机路径
  2. [root@iZbp17prsnk785pvagnbe5Z /]# docker exec -it centos /bin/bash
  3. [root@3f9faf742893 /]# ls
  4. bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
  5. [root@3f9faf742893 /]# cd home
  6. [root@3f9faf742893 home]# ls
  7. [root@3f9faf742893 home]# touch hello.txt
  8. [root@3f9faf742893 home]# ls
  9. hello.txt
  10. [root@3f9faf742893 home]# exit
  11. exit
  12. [root@iZbp17prsnk785pvagnbe5Z /]# docker cp centos:/home/hello.txt /home
  13. [root@iZbp17prsnk785pvagnbe5Z /]# cd home
  14. [root@iZbp17prsnk785pvagnbe5Z home]# ls
  15. admin hello.txt
  16. # 拷贝是一个手动过程,未来使用 -v 卷的技术,可以实现自动同步

小结

image.png

作业练习

Nginx

  1. [root@iZbp17prsnk785pvagnbe5Z home]# docker run -d --name=nginx -p 3344:80 nginx
  2. [root@iZbp17prsnk785pvagnbe5Z home]# curl localhost:3344
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <title>Welcome to nginx!</title>
  7. <style>
  8. body {
  9. width: 35em;
  10. margin: 0 auto;
  11. font-family: Tahoma, Verdana, Arial, sans-serif;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <h1>Welcome to nginx!</h1>
  17. <p>If you see this page, the nginx web server is successfully installed and
  18. working. Further configuration is required.</p>
  19. <p>For online documentation and support please refer to
  20. <a href="http://nginx.org/">nginx.org</a>.<br/>
  21. Commercial support is available at
  22. <a href="http://nginx.com/">nginx.com</a>.</p>
  23. <p><em>Thank you for using nginx.</em></p>
  24. </body>
  25. </html>

Tomcat

  1. # 官方的使用,加上 --rm 一般用来测试,用完立即删除
  2. docker run -it --rm tomcat:9.0
  3. # 自己,下载再启动
  4. [root@iZbp17prsnk785pvagnbe5Z opt]# docker run -d --name=tomcat -p 3344:8080 tomcat:9.0
  5. # 进入容器
  6. [root@iZbp17prsnk785pvagnbe5Z opt]# docker exec -it tomcat /bin/bash
  7. # 发现1.linux命令少了,2.没有webapps。
  8. # 阿里云镜像默认是最小的镜像,会剔除掉不必要的东西。保证最小可运行的环境。

ES+Kibana

  1. # es暴露的端口很多
  2. # es十分耗内存
  3. # es的数据一般需要放置到安全目录!挂载
  4. # --net somenetwork ? 网络配置
  5. # 启动ES
  6. docker run -d --name es --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
  7. # 启动后linux变卡了 docker stats 查看cpu的状态
  8. # 测试是否启动成功
  9. [root@iZbp17prsnk785pvagnbe5Z opt]# curl localhost:9200
  10. {
  11. "name" : "110b729878b4",
  12. "cluster_name" : "docker-cluster",
  13. "cluster_uuid" : "R4OKQCETSi2F_mTEyMorBg",
  14. "version" : {
  15. "number" : "7.6.2",
  16. "build_flavor" : "default",
  17. "build_type" : "docker",
  18. "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
  19. "build_date" : "2020-03-26T06:34:37.794943Z",
  20. "build_snapshot" : false,
  21. "lucene_version" : "8.4.0",
  22. "minimum_wire_compatibility_version" : "6.8.0",
  23. "minimum_index_compatibility_version" : "6.0.0-beta1"
  24. },
  25. "tagline" : "You Know, for Search"
  26. }

image.png

  1. # 增加内存限制,修改配置文件 -e 环境配置修改
  2. docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

image.png
kibana如何连接到es?
image.png

可视化

  • portainer

    Docker镜像讲解

    镜像是什么

    image.png
    image.png

    分层理解

    image.png
    image.png
    image.png
    image.png
    image.png

    commit镜像

    1. docker commit 提交容器成为一个新的副本
    2. docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]

    实战测试

    启动一个默认的tomcat
    # 发现默认的tomcat是没有webapps应用
    # 自己拷贝进去文件
    # 将操作过的容器通过commit提交为一个镜像
    image.png

    容器数据卷

    使用数据卷

  • 方式一:直接使用命令来挂载 -v ```powershell docker run -it -v 主机目录:容器内目录

[root@iZbp17prsnk785pvagnbe5Z home]# docker run -it —name=centos -v /home/ceshi:/home centos /bin/bash

启动之后我们可以通过 docker insepct 容器id 来查看容器详情

双向同步

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/21580132/1633789949877-c0a714b4-5996-4a06-a770-78cc8c244aa3.png#clientId=uc804887a-8a0f-4&from=paste&height=193&id=u8896a5cf&margin=%5Bobject%20Object%5D&name=image.png&originHeight=385&originWidth=906&originalType=binary&ratio=1&size=42296&status=done&style=none&taskId=u2081738e-8e0e-4470-bac5-bc28d056f88&width=453)
  2. <a name="pYwfk"></a>
  3. ### 实战:安装MySQL
  4. 思考:MySQL的数据持久化问题
  5. ```powershell
  6. # 运行容器,需要数据挂载
  7. # 官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
  8. # 启动MySQL
  9. -d 后台运行
  10. -p 端口映射
  11. -v 卷挂载
  12. -e 环境配置
  13. --name 容器名字
  14. [root@iZbp17prsnk785pvagnbe5Z home]# docker run -d --name=mysql01 -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
  15. # 阿里云防火墙允许3306端口暴露,Navicat连接成功。

具名和匿名挂载

  1. # 匿名挂载
  2. docker run -d -P --name=nginx01 -v /etc/nginx nginx
  3. # 查看所有卷的情况
  4. [root@iZbp17prsnk785pvagnbe5Z /]# docker volume ls
  5. DRIVER VOLUME NAME
  6. local 4b1bc254463977de4afa93ed0a8da25decb084a9109c315db5b0a27ba62d31e4
  7. local 9ffbac76c08bc0c9d46cf4dc0196baa48bb6f13422dcf1f209d540eda9c4f242
  8. local 84df32bf77c16256ab4bf821ff9caaefe16517bebae0d8853457b9a5f18e958a
  9. local f2dd68a1e69d12017f86f5c9c5ebc7fa862b800c9a845bf432db51433c372791
  10. # 匿名挂载,我们在 -v 只写了容器内的路径,没有容器外的路径!
  11. # 具名挂载
  12. -v 卷名:容器内路径
  13. [root@iZbp17prsnk785pvagnbe5Z /]# docker run -d -P --name=nginx02 -v juming:/etc/nginx nginx
  14. d33d02ceaf36e5f2e34ba738cb5e523c506b69e16b608e1c3614082b7bcdd4fd
  15. [root@iZbp17prsnk785pvagnbe5Z /]# docker volume ls
  16. DRIVER VOLUME NAME
  17. local 4b1bc254463977de4afa93ed0a8da25decb084a9109c315db5b0a27ba62d31e4
  18. local 9ffbac76c08bc0c9d46cf4dc0196baa48bb6f13422dcf1f209d540eda9c4f242
  19. local 84df32bf77c16256ab4bf821ff9caaefe16517bebae0d8853457b9a5f18e958a
  20. local f2dd68a1e69d12017f86f5c9c5ebc7fa862b800c9a845bf432db51433c372791
  21. local juming
  22. [root@iZbp17prsnk785pvagnbe5Z etc]# docker volume inspect juming
  23. [
  24. {
  25. "CreatedAt": "2021-10-04T22:58:12+08:00",
  26. "Driver": "local",
  27. "Labels": null,
  28. "Mountpoint": "/var/lib/docker/volumes/juming/_data",
  29. "Name": "juming",
  30. "Options": null,
  31. "Scope": "local"
  32. }
  33. ]

image.png
所有的docker容器内的卷,没有指定目录的情况下的都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载

  1. # 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
  2. -v 容器内路径 #匿名挂载
  3. -v 卷名:容器内路径 #具名挂载
  4. -v /主机路径:容器内路径 #指定路径挂载

拓展:

  1. # 通过 -v 容器内路径:ro rw 改变读写权限
  2. ro readonly #只读
  3. rw readwrite #可读可写
  4. # 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了。
  5. docker run -d -P --name=nginx02 -v juming:/etc/nginx:ro nginx
  6. docker run -d -P --name=nginx02 -v juming:/etc/nginx:rw nginx
  7. # ro 只要看到,就说明这个路径只能通过主机来操作,容器内部无法操作

初识DockerFile

DockerFile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。

  1. # 创建一个dockerfile文件
  2. [root@iZbp17prsnk785pvagnbe5Z docker-test-volume]# vim dockerfile1
  3. # 文件中的指令(大写) 参数
  4. FROM centos
  5. VOLUME ["volume01","volume02"]
  6. CMD echo "------end------"
  7. CMD /bin/bash
  8. # 每个命令都是镜像的一层!
  9. [root@iZbp17prsnk785pvagnbe5Z docker-test-volume]# docker build -f dockerfile1 -t brandon/centos:1.0 .
  10. Sending build context to Docker daemon 2.048kB
  11. Step 1/4 : FROM centos
  12. ---> 300e315adb2f
  13. Step 2/4 : VOLUME ["volume01","volume02"]
  14. ---> Running in 32bca8843967
  15. Removing intermediate container 32bca8843967
  16. ---> f1e3940784fd
  17. Step 3/4 : CMD echo "------end------"
  18. ---> Running in 6ee387c024c9
  19. Removing intermediate container 6ee387c024c9
  20. ---> 0866e4790e90
  21. Step 4/4 : CMD /bin/bash
  22. ---> Running in 6f7c42333990
  23. Removing intermediate container 6f7c42333990
  24. ---> 4029bd2fdf5c
  25. Successfully built 4029bd2fdf5c
  26. Successfully tagged brandon/centos:1.0

启动自己的镜像
image.png
红框中这个目录就是我们生成镜像的时候自动挂载的,数据卷目录。这个卷和外部一定有一个同步的目录!
image.png
用 docker inspect 容器id 查看
image.png
image.png

数据卷容器

image.png

  1. [root@iZbp17prsnk785pvagnbe5Z ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. brandon/centos 1.0 4029bd2fdf5c 9 hours ago 209MB
  4. tomcat01 1.0 98e5d7ff833c 20 hours ago 685MB
  5. tomcat 9.0 86783bb5af6c 5 days ago 680MB
  6. redis latest aa4d65e670d6 2 months ago 105MB
  7. nginx latest 08b152afcfae 2 months ago 133MB
  8. mysql latest 95db2e2bd882 2 months ago 514MB
  9. centos latest 300e315adb2f 10 months ago 209MB
  10. elasticsearch 7.6.2 f29a1ee41030 18 months ago 791MB
  11. [root@iZbp17prsnk785pvagnbe5Z ~]# docker run -it --name=centos01 brandon/centos:1.0 /bin/bash
  12. [root@8f32e1e7fa67 /]# ls -l
  13. total 56
  14. lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
  15. drwxr-xr-x 5 root root 360 Oct 5 00:47 dev
  16. drwxr-xr-x 1 root root 4096 Oct 5 00:47 etc
  17. drwxr-xr-x 2 root root 4096 Nov 3 2020 home
  18. lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
  19. lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  20. drwx------ 2 root root 4096 Dec 4 2020 lost+found
  21. drwxr-xr-x 2 root root 4096 Nov 3 2020 media
  22. drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
  23. drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
  24. dr-xr-xr-x 108 root root 0 Oct 5 00:47 proc
  25. dr-xr-x--- 2 root root 4096 Dec 4 2020 root
  26. drwxr-xr-x 11 root root 4096 Dec 4 2020 run
  27. lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  28. drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
  29. dr-xr-xr-x 13 root root 0 Oct 4 15:41 sys
  30. drwxrwxrwt 7 root root 4096 Dec 4 2020 tmp
  31. drwxr-xr-x 12 root root 4096 Dec 4 2020 usr
  32. drwxr-xr-x 20 root root 4096 Dec 4 2020 var
  33. drwxr-xr-x 2 root root 4096 Oct 5 00:47 volume01
  34. drwxr-xr-x 2 root root 4096 Oct 5 00:47 volume02
  35. # 启动02
  36. [root@iZbp17prsnk785pvagnbe5Z ~]# docker run -it --name=centos02 --volumes-from centos01 brandon/centos:1.0
  37. # 切换窗口进入01
  38. [root@iZbp17prsnk785pvagnbe5Z /]# docker exec -it centos01 /bin/bash
  39. [root@8f32e1e7fa67 /]# ls
  40. bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
  41. [root@8f32e1e7fa67 /]# cd volume01/
  42. [root@8f32e1e7fa67 volume01]# ls
  43. [root@8f32e1e7fa67 volume01]# touch 1.txt
  44. # 进入02查看
  45. [root@9fddee554348 /]# cd volume01
  46. [root@9fddee554348 volume01]# ls
  47. 1.txt

多个mysql实现数据共享

  1. [root@iZbp17prsnk785pvagnbe5Z home]# docker run -d --name=mysql01 -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
  2. [root@iZbp17prsnk785pvagnbe5Z home]# docker run -d --name=mysql02 -p 3306:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql

结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止

DockerFile

dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:

  1. 编写一个dockerfile文件
  2. docker build构建成为一个镜像
  3. docker run运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库)

    DockerFile构建过程

    基础知识:
    1、每个保留关键字(指令)都是必须大写字母
    2、执行从上倒下顺序执行
    3、#表示注释
    4、每一个指令都会创建提交一个新的镜像层,并提交
    image.png
    dockerfile是面向开发的,我们以后发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
    Docker镜像逐渐成为企业交付的标准,必须要掌握!
    步骤:开发,部署,运维
    DockerFile:构建文件,定义了一切步骤,源代码
    DockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品
    Docker容器:容器就是镜像运行起来提供服务器

    DockerFile的指令

    1. FROM # 基础镜像,一切从这里开始构建
    2. MAINTAINER # 镜像是谁写的
    3. RUN # 镜像构建的时候需要运行的命令
    4. ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容
    5. WORKDIR # 镜像的工作目录
    6. VOLUME # 挂载的目录
    7. EXPOSE # 指定暴露端口
    8. CMD # 指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    9. ENREYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
    10. ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的命令。触发指令。
    11. COPY # 类似ADD,将我们文件拷贝到镜像中
    12. ENV # 构建的时候设置环境变量
    Docker当然要会啦! - 图21

    实战测试

    DockerHub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建
    image.png ```powershell

    自己创建一个centos

1、编写dockerfile文件

[root@iZbp17prsnk785pvagnbe5Z dockerfile]# vim myDockerfile-centos FROM centos MAINTAINER ht123456@163.com

ENV MYPATH /usr/local WORKDIR $MYPATH

RUN yum -y install vim RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH CMD echo “——-end——-“ CMD /bin/bash

2、通过文件构建镜像

-f dockerfile文件路径

-t 镜像名:[tag]

[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker build -f myDockerfile-centos -t myCentos:0.1 .

3、测试运行

[root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run -it mycentos:0.1 [root@3c05a4ede375 local]# ls bin etc games include lib lib64 libexec sbin share src [root@3c05a4ede375 local]# pwd /usr/local [root@3c05a4ede375 local]# ifconfig eth0: flags=4163 mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 8 bytes 656 (656.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@3c05a4ede375 local]# vim

  1. ```powershell
  2. # docker histor 查看镜像构建过程
  3. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker history mycentos:0.1
  4. IMAGE CREATED CREATED BY SIZE COMMENT
  5. e02d32c971ae 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
  6. a95443209d9d 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
  7. 6a91279aa4af 13 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
  8. 8f004616c44d 13 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
  9. 97cd9849e33a 13 minutes ago /bin/sh -c yum -y install net-tools 32MB
  10. 92231ce8678b 13 minutes ago /bin/sh -c yum -y install vim 72MB
  11. 27183ac7cf30 14 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
  12. 6830ab186be6 14 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
  13. 163cc5d4450f 14 minutes ago /bin/sh -c #(nop) MAINTAINER ht<123456@163.… 0B
  14. 300e315adb2f 10 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  15. <missing> 10 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
  16. <missing> 10 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB

CMD和ENTRYPOINT的区别

CMD # 指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENREYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令

  1. # 测试CMD
  2. # 编写dockerfile文件
  3. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# cat dockerfile-cmd-test
  4. FROM centos
  5. CMD ["ls", "-a"]
  6. # 构建镜像
  7. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:0.1 .
  8. Sending build context to Docker daemon 3.072kB
  9. Step 1/2 : FROM centos
  10. ---> 300e315adb2f
  11. Step 2/2 : CMD ["ls", "-a"]
  12. ---> Running in da7aae00d569
  13. Removing intermediate container da7aae00d569
  14. ---> 60eece1c0705
  15. Successfully built 60eece1c0705
  16. Successfully tagged cmdtest:0.1
  17. # 运行镜像,发现 ls -a 生效
  18. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run -it cmdtest:0.1
  19. . .dockerenv dev home lib64 media opt root sbin sys usr
  20. .. bin etc lib lost+found mnt proc run srv tmp var
  21. # 想追加一个命令 -l ls -al
  22. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run cmdtest:0.1 -l
  23. docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
  24. ERRO[0000] error waiting for container: context canceled
  25. # CMD命令下,-l 替换了CMD["ls","-a"]命令,-l不是命令所有报错。
  1. # 测试ENTRYPOINT
  2. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# vim dockerfile-entrypoint-test
  3. FROM centos
  4. ENTRYPOINT ["ls", "-a"]
  5. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker build -f dockerfile-entrypoint-test -t entrytest:0.1 .
  6. Sending build context to Docker daemon 4.096kB
  7. Step 1/2 : FROM centos
  8. ---> 300e315adb2f
  9. Step 2/2 : ENTRYPOINT ["ls","-a"]
  10. ---> Running in cda4cc709a62
  11. Removing intermediate container cda4cc709a62
  12. ---> 5f93349de81f
  13. Successfully built 5f93349de81f
  14. Successfully tagged entrytest:0.1
  15. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run entrytest:0.1
  16. .
  17. ..
  18. .dockerenv
  19. bin
  20. dev
  21. etc
  22. home
  23. lib
  24. lib64
  25. lost+found
  26. media
  27. mnt
  28. opt
  29. proc
  30. root
  31. run
  32. sbin
  33. srv
  34. sys
  35. tmp
  36. usr
  37. var
  38. # 追加的命令,是直接拼接在ENTRYPOINT命令的后面
  39. [root@iZbp17prsnk785pvagnbe5Z dockerfile]# docker run entrytest:0.1 -l
  40. total 56
  41. drwxr-xr-x 1 root root 4096 Oct 5 12:48 .
  42. drwxr-xr-x 1 root root 4096 Oct 5 12:48 ..
  43. -rwxr-xr-x 1 root root 0 Oct 5 12:48 .dockerenv
  44. lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
  45. drwxr-xr-x 5 root root 340 Oct 5 12:48 dev
  46. drwxr-xr-x 1 root root 4096 Oct 5 12:48 etc
  47. drwxr-xr-x 2 root root 4096 Nov 3 2020 home
  48. lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
  49. lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  50. drwx------ 2 root root 4096 Dec 4 2020 lost+found
  51. drwxr-xr-x 2 root root 4096 Nov 3 2020 media
  52. drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
  53. drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
  54. dr-xr-xr-x 107 root root 0 Oct 5 12:48 proc
  55. dr-xr-x--- 2 root root 4096 Dec 4 2020 root
  56. drwxr-xr-x 11 root root 4096 Dec 4 2020 run
  57. lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  58. drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
  59. dr-xr-xr-x 13 root root 0 Oct 4 15:41 sys
  60. drwxrwxrwt 7 root root 4096 Dec 4 2020 tmp
  61. drwxr-xr-x 12 root root 4096 Dec 4 2020 usr
  62. drwxr-xr-x 20 root root 4096 Dec 4 2020 var

DockerFile中很多命令都十分相似。

实战:部署node服务

  1. $ vim Dockerfile
  2. FROM node:latest
  3. RUN mkdir -p /home/www/express
  4. WORKDIR /home/www/express
  5. COPY . /home/www/express
  6. RUN npm install
  7. EXPOSE 3000
  8. ENTRYPOINT ["npm", "run"]
  9. CMD ["start"]

这个文件包含了以下命令:

  • FROM node:latest - 指定使用最新版本的node基础镜像
  • RUN mkdir -p /home/www/express - 在容器内创建/home/www/express目录
  • WORKDIR /home/www/express - 将容器内工作目录设置为/home/www/express
  • COPY . /home/www/express - 将宿主机当前目录下内容复制到镜像/home/www/express目录下
  • RUN npm install - npm install安装应用所需的NPM包
  • EXPOSE 3000 - 对外开放容器的3000端口
  • ENTRYPOINT [“npm”, “run”] - 容器启动后执行的命令。不可被docker run提供的参数覆盖
  • CMD [“start”] - 在容器启动时,执行的命令,可被docker run提供的参数覆盖 ```powershell

    将镜像命名为test/express

    docker build -t test/express .

运行容器

docker run -d —name experss-app -p 3000:3000 test/express

  1. <a name="Xdf8k"></a>
  2. ## 实战:Tomcat镜像
  3. 1、准备镜像文件 tomcat 压缩包,jdk的压缩包<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21580132/1633790752863-486478c6-7a31-457c-a99f-629a99066702.png#clientId=uc804887a-8a0f-4&from=paste&height=39&id=u27f44029&margin=%5Bobject%20Object%5D&name=image.png&originHeight=78&originWidth=683&originalType=binary&ratio=1&size=9775&status=done&style=none&taskId=ua0661ea4-9497-464a-8df6-d16cbe201c6&width=341.5)<br />2、编写Dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要 -f 指定了。
  4. ```powershell
  5. FROM centos
  6. COPY readme.txt /usr/local/readme.txt
  7. ADD jdk-8u11-linux-x64.tar.gz /usr/local/
  8. ADD apache-tomcat-9.0.54.tar.gz /usr/local/
  9. RUN yum -y install vim
  10. ENV MYPATH /usr/local
  11. WORKDIR $MYPATH
  12. ENV JAVA_HOME /usr/local/jdk1.8.0_11
  13. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  14. ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54
  15. ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.54
  16. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  17. EXPOSE 8080
  18. CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out

3、构建镜像

  1. [root@iZbp17prsnk785pvagnbe5Z tomcat]# docker build -t diytomcat:1.0 .

4、启动自建镜像

  1. [root@iZbp17prsnk785pvagnbe5Z tomcat]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. diytomcat 1.0 51860abc46cf 2 minutes ago 621MB
  4. [root@iZbp17prsnk785pvagnbe5Z tomcat]# docker run -d -p 9090:8080 --name=diytomcat -v /home/dockerfile/tomcat/test:/usr/local/apache-tomcat-9.0.54/webapps -v /home/dockerfile/tomcat/logs:/usr/local/apache-tomcat-9.0.54/logs diytomcat:1.0

5、访问测试
6、发布项目

发布自己的镜像

1、登录阿里云
2、进入容器镜像服务
3、创建命名空间
image.png
4、创建容器镜像
image.png
5、浏览阿里云
image.png

  1. $ docker login --username=程序猿没有春天 registry.cn-hangzhou.aliyuncs.com
  2. $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ht-docker-test/ht-test:[镜像版本号]
  3. $ docker push registry.cn-hangzhou.aliyuncs.com/ht-docker-test/ht-test:[镜像版本号]
  4. $ docker pull registry.cn-hangzhou.aliyuncs.com/ht-docker-test/ht-test:[镜像版本号]

Docker网络