Docker安装

  1. # 需要的安装包
  2. yum install -y yum-tuils
  3. 或者
  4. yum install -y yum-utils device-mapper-persistent-data lvm2
  5. # 设置镜像的仓库
  6. yum-config-manager \
  7. --add-repo \
  8. http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  9. # 更新软件包索引
  10. yum makecache fast
  11. # 安装docker相关的源 docker-ce 社区 ee 企业版
  12. yum install docker-ce docker-ce-cli containerd.io
  13. # 启动docker
  14. sudo systemctl start docker
  15. # 或者su切换到root用户,输入以下命令,如切换失败,可使用sudo passwd root设置密码后,重新su
  16. service docker start
  17. # 确定是否启动成功,会显示docker的版本相关信息
  18. docker version
  19. # 测试docker程序
  20. docker run hello-world
  21. #docker开机自启动
  22. sudo systemctl enable docker

切换镜像

在window子系统中使用如下方式

  1. # su切换到root用户,输入以下命令,如切换失败,可使用sudo passwd root设置密码后,重新su
  2. vim /etc/docker/daemon.json
  3. # a键进行编辑,将以下内容粘贴进去,ctrl+c 输入:wq 保存
  4. {"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
  5. # 然后重启服务
  6. sudo service docker restart
  7. # 查看是否切换成功
  8. docker info
  9. # 显示如下信息成功
  10. -Registry Mirrors:
  11. -https://reg-mirror.qiniu.com

镜像配置(下载速度更快)

  1. # 修改docker配置文件
  2. vim /etc/docker/daemon.json
  3. # 填入以下内容,`i` 进行编辑模式
  4. {
  5. "registry-mirrors": ["https://5tccbbo5.mirror.aliyuncs.com"]
  6. }
  7. # ctrl+c 输入 :wq保存
  8. #在windows子系统中重启docker的命令
  9. sudo service docker restart

阿里云镜像加速器

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors":["https://82m9ar63.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

Docker卸载

  1. sudo apt-get remove docker docker-engine docker.io containerd runc

Docker常用命令

帮助命令

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

帮助文档的网址 https://docs.docker.com/reference/

镜像命令

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

  1. cinz@DESKTOP-S0IK5KG:~$ docker images
  2. # 解释
  3. REPOSITORY 镜像的仓库源
  4. TAG 镜像的标签
  5. IMAGE ID 镜像的ID
  6. CREATED 镜像的创建时间
  7. SIZE 镜像的大小
  8. # 命令可选项
  9. Options:
  10. -a, --all Show all images (default hides intermediate images),列出所有(全部)镜像
  11. --digests Show digests
  12. -f, --filter filter Filter output based on conditions provided
  13. --format string Pretty-print images using a Go template
  14. --no-trunc Don't truncate output
  15. -q, --quiet Only show image IDs,只显示镜像的id
  16. -aq # 显示某id所有的镜像

docker search 搜索镜像

  1. root@DESKTOP-S0IK5KG:/home/cinz# docker search mysql
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. mysql MySQL is a widely used, open-source relation 12339 [OK]
  4. mariadb MariaDB Server is a high performing open sou 4746 [OK]
  5. mysql/mysql-server Optimized MySQL Server Docker images. Create 916 [OK]
  6. # 可选项,通过搜索来过滤
  7. --filter , -f Filter output based on conditions provided
  8. --limit 25 Max number of search results
  9. #例子
  10. root@DESKTOP-S0IK5KG:/home/cinz# docker search mysql -f=stars=3000 # 搜索mysql镜像 过滤stars>=3000的镜像

docker pull 下载镜像

  1. # 下载镜像 docker pull 镜像名[:tag]
  2. root@DESKTOP-S0IK5KG:/home/cinz# docker pull mysql
  3. Using default tag: latest # 如果不写 tag,默认就是 latest
  4. latest: Pulling from library/mysql
  5. f003217c5aae: Pull complete # 分层下载,docker image的核心 联合文件系统
  6. 65d94f01a09f: Pull complete
  7. 43d78aaa6078: Pull complete
  8. a0f91ffbdf69: Pull complete
  9. 59ee9e07e12f: Pull complete
  10. 04d82978082c: Pull complete
  11. 70f46ebb971a: Pull complete
  12. db6ea71d471d: Pull complete
  13. c2920c795b25: Pull complete
  14. 26c3bdf75ff5: Pull complete
  15. 9ec1f1f78b0e: Pull complete
  16. 4607fa685ac6: Pull complete
  17. Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195 # 签名
  18. Status: Downloaded newer image for mysql:latest
  19. docker.io/library/mysql:latest # 真实地址
  20. # 注意,他们是等价的
  21. docker pull mysql
  22. docker pull docker.io/library/mysql:latest
  23. # 指定版本下载
  24. root@DESKTOP-S0IK5KG:/home/cinz# docker pull mysql:5.7

docker rmi 删除镜像

  1. docker rmi -f 容器id # 删除指定的容器
  2. docker rmi -f 容器id 容器id 容器id # 删除多个容器
  3. docker rmi -f $(docker images -aq) # 删除全部的容器
  4. # 例子
  5. root@DESKTOP-S0IK5KG:/home/cinz# docker images # 查看所有镜像
  6. REPOSITORY TAG IMAGE ID CREATED SIZE
  7. mysql 5.7 f26e21ddd20d 2 days ago 450MB
  8. mysql latest 667ee8fb158e 2 days ago 521MB
  9. hello-world latest feb5d9fea6a5 6 months ago 13.3kB
  10. root@DESKTOP-S0IK5KG:/home/cinz# docker rmi -f f26e21ddd20d # 通过镜像ID删除镜像
  11. Untagged: mysql:5.7
  12. Untagged: mysql@sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc
  13. Deleted: sha256:f26e21ddd20df245d88410116241f3eef1ec49ce888856c95b85081a7250183d
  14. Deleted: sha256:c607cd1716e1e3f52d37b391b9e48207c15b9de687c49539c42b7c7411b8a845
  15. Deleted: sha256:18d0239fa88c234ffcde52288f532ac4f69d052964d6605df32fb2e3a197bbf9
  16. Deleted: sha256:8d1d80a87e029e4729a56a87e38d54b9ef2ca1af404e13af1feadeba53745529
  17. Deleted: sha256:1ac7c17dadb8b439a4034925f290a2f9288068b4192669bed1a614c4057c0c1b
  18. root@DESKTOP-S0IK5KG:/home/cinz# docker images # 重新查看所有镜像是否删除成功
  19. REPOSITORY TAG IMAGE ID CREATED SIZE
  20. mysql latest 667ee8fb158e 2 days ago 521MB
  21. hello-world latest feb5d9fea6a5 6 months ago 13.3kB
  22. ---------------------------------------------------------------
  23. root@DESKTOP-S0IK5KG:/home/cinz# docker rmi -f $(docker images -aq) # 查出所有镜像的ID 强制删除图像
  24. Untagged: mysql:latest
  25. Untagged: mysql@sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195
  26. Deleted: sha256:667ee8fb158e365450fc3f09712208fe44e9f1364a9b130fed95f3f4862f8a63
  27. Deleted: sha256:daba3b5cd1b725f259d5d59049c7011f6a20f2e7e4782b873cadeedbc1a4f122
  28. Deleted: sha256:407a68a397de3c8e4da2ccd388f27c795519414cc9319f674e7b9a492cd8514b
  29. Deleted: sha256:6967db79cb8031d7e505dd82c91c6426e84c6ad2098d06c1c090485886bc1c63
  30. Deleted: sha256:3dcc0f922d11309b2e4870d5f42c5005f086c9b9c1e128ed2b712b65fa79a5c9
  31. Deleted: sha256:ae5d4ab2734d5c27069212b2690dc2c7ac4cd85ee5e122607cb175f7fe908914
  32. Deleted: sha256:610784bcaae50e999566928bdec7a4e146fe075d9e487bde0a228c99013ff1d9
  33. Deleted: sha256:ccebaff04ea21a9e2df07f9d5af5c47ccd141cd3590f4d45784b6075e7c17ded
  34. Deleted: sha256:716203221cd982fc07b80efda0c53a759ecfd69b2d93d4e8adf5fa094351372e
  35. Deleted: sha256:fbd4939b3eb58642a07003e076acc3d0d8140797f61139ce4d3645790d9c8b51
  36. Deleted: sha256:88f8458b4b2030b229b9757bd4061bce58b65e831a0bba8fa71aa8b3f87db630
  37. Deleted: sha256:f2f431ab3ddc1460d300cd86016cc03b7611b56f04bd88370da3d378b3d10aea
  38. Deleted: sha256:c1065d45b8722a4385f2ee26116e1859e8083400ee00d2beff3fdd5225bfeee9
  39. Untagged: hello-world:latest
  40. Untagged: hello-world@sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
  41. Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
  42. root@DESKTOP-S0IK5KG:/home/cinz# docker images
  43. REPOSITORY TAG IMAGE ID CREATED SIZE

Docker 镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:

  • 从远程仓库下载
  • 朋友拷贝
  • 自己制作 DockerFIle

Docker镜像加载原理

UnionFS(联合文件系统)

  • UnionFS(联合文件系统):Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
  • 特性︰一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

  • bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  • rootfs (root file system),在bootfs之上。包含的就是典型Linux.系统中的/dev, /proc, /bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。
    Docker - 图1
    平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M ?

对于一个精简的os, rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel ,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。

虚拟机是分钟级别,容器是秒级!

容器命令

说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习

  1. docker pull centos

新建容器并启动

  1. docker run [可选参数] image
  2. # 参数说明
  3. --name="Name" 容器名字 tomcat01 tomcat2,用来区分容器
  4. -d 后台方式运行
  5. -it 使用交互方式进行,进入容器查看内容
  6. -p 指定容器的端口 -p 8080:8080
  7. -p ip:主机端口:容器端口
  8. -p 主机端口:容器端口 (常用)
  9. -p 容器端口
  10. -p 随机指定端口
  11. # 测试 启动并进入容器
  12. root@DESKTOP-S0IK5KG:/home/cinz# docker run -it centos /bin/bash
  13. [root@0c7e15096bb6 /]#ls #查看容器内的centos,基础版本,很多命令都是不完善的!
  14. bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
  15. #从容器中退回主机
  16. [root@0c7e15096bb6 /]# exit
  17. #查看主机中目录
  18. bin boot dev etc home init lib lib32 lib64 libx32 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var

列出所有运行的容器

  1. docker ps 命令 # 列出正在运行的容器
  2. -a # 列出当前正在运行的容器+带出历史运行过的容器
  3. -n=? # 显示最近创建的容器
  4. -q # 只显示容器编号,静默模式
  5. root@DESKTOP-S0IK5KG:/# docker ps
  6. root@DESKTOP-S0IK5KG:/# docker ps -a

退出容器

  1. exit # 直接容器停止并退出
  2. ctrl + P + Q # 容器不停止退出

删除容器

  1. docker rm 容器id # 删除指定的容器(不能删除正在删除的容器,如果要强制删除 rm -f)
  2. docker rm -f $(docker ps -aq) # 删除所有的容器
  3. docker ps -a | xargs docker rm # 删除所有的容器

启动和停止容器的操作

  1. docker start 容器id # 启动容器
  2. docker restart 容器id # 重启容器
  3. docker stop 容器id # 停止当前正在运行的容器
  4. docker kill 容器id # 强制停止当前容器

常用的其他命令

后台启动容器

  1. # 命令 docker run -d 镜像名
  2. root@DESKTOP-S0IK5KG:/# docker run -d centos
  3. # 问题docker ps:发现centos停止了
  4. # 常见的坑:docker容器使用后台运行,就必须要一个前台进程,docker发现没有应用,就会自动停止
  5. # 假如安装一个nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就没有程序了

查看日志

  1. docker logs -f -t --tail [行数] 容器id #容器没有日志就不会显示
  2. docker logs -tf 容器id #显示全部日志,容器没有日志就不会显示
  3. # 自己编写一段shell脚本
  4. root@DESKTOP-S0IK5KG:/home/cinz# docker run -d centos /bin/sh "while true;do echo zengcheng;sleep 1;done"
  5. #参数
  6. -f # 跟随最新的日志打印
  7. -t # 时间戳
  8. -tf # 显示日志
  9. --tail # 要显示的日志条数

查看容器中进程信息 ps

  1. # 命令
  2. docker top 容器id 查看容器中的进程
  3. #测试
  4. root@DESKTOP-S0IK5KG:/home/cinz# docker top 5a7267e49878
  5. UID PID PPID C STIME TTY TIME CMD
  6. root 5745 5725 0 18:04 ? 00:00:00 /bin/sh -c while true;do echo zengcheng;sleep 1;done
  7. root 6571 5745 0 18:15 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像的元数据

  1. # 命令
  2. docker inspect 容器id 查看容器的全部信息(元数据)
  3. # 测试
  4. root@DESKTOP-S0IK5KG:/home/cinz# docker inspect 5a7267e49878
  5. [
  6. {
  7. "Id": "5a7267e4987884b64b786635f68ded3333a656812ff71d162c83dea9f95316a8",
  8. "Created": "2022-04-01T10:04:03.508823592Z",
  9. "Path": "/bin/sh",
  10. "Args": [
  11. "-c",
  12. "while true;do echo zengcheng;sleep 1;done"
  13. ],
  14. "State": {
  15. "Status": "running",
  16. "Running": true,
  17. "Paused": false,
  18. "Restarting": false,
  19. "OOMKilled": false,
  20. "Dead": false,
  21. "Pid": 5745,
  22. "ExitCode": 0,
  23. "Error": "",
  24. "StartedAt": "2022-04-01T10:04:03.88594638Z",
  25. "FinishedAt": "0001-01-01T00:00:00Z"
  26. },
  27. "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
  28. "ResolvConfPath": "/var/lib/docker/containers/5a7267e4987884b64b786635f68ded3333a656812ff71d162c83dea9f95316a8/resolv.conf",
  29. "HostnamePath": "/var/lib/docker/containers/5a7267e4987884b64b786635f68ded3333a656812ff71d162c83dea9f95316a8/hostname",
  30. "HostsPath": "/var/lib/docker/containers/5a7267e4987884b64b786635f68ded3333a656812ff71d162c83dea9f95316a8/hosts",
  31. "LogPath": "/var/lib/docker/containers/5a7267e4987884b64b786635f68ded3333a656812ff71d162c83dea9f95316a8/5a7267e4987884b64b786635f68ded3333a656812ff71d162c83dea9f95316a8-json.log",
  32. "Name": "/affectionate_jepsen",
  33. "RestartCount": 0,
  34. "Driver": "overlay2",
  35. "Platform": "linux",
  36. "MountLabel": "",
  37. "ProcessLabel": "",
  38. "AppArmorProfile": "",
  39. "ExecIDs": null,
  40. "HostConfig": {
  41. "Binds": null,
  42. "ContainerIDFile": "",
  43. "LogConfig": {
  44. "Type": "json-file",
  45. "Config": {}
  46. },
  47. "NetworkMode": "default",
  48. "PortBindings": {},
  49. "RestartPolicy": {
  50. "Name": "no",
  51. "MaximumRetryCount": 0
  52. },
  53. "AutoRemove": false,
  54. "VolumeDriver": "",
  55. "VolumesFrom": null,
  56. "CapAdd": null,
  57. "CapDrop": null,
  58. "CgroupnsMode": "host",
  59. "Dns": [],
  60. "DnsOptions": [],
  61. "DnsSearch": [],
  62. "ExtraHosts": null,
  63. "GroupAdd": null,
  64. "IpcMode": "private",
  65. "Cgroup": "",
  66. "Links": null,
  67. "OomScoreAdj": 0,
  68. "PidMode": "",
  69. "Privileged": false,
  70. "PublishAllPorts": false,
  71. "ReadonlyRootfs": false,
  72. "SecurityOpt": null,
  73. "UTSMode": "",
  74. "UsernsMode": "",
  75. "ShmSize": 67108864,
  76. "Runtime": "runc",
  77. "ConsoleSize": [
  78. 0,
  79. 0
  80. ],
  81. "Isolation": "",
  82. "CpuShares": 0,
  83. "Memory": 0,
  84. "NanoCpus": 0,
  85. "CgroupParent": "",
  86. "BlkioWeight": 0,
  87. "BlkioWeightDevice": [],
  88. "BlkioDeviceReadBps": null,
  89. "BlkioDeviceWriteBps": null,
  90. "BlkioDeviceReadIOps": null,
  91. "BlkioDeviceWriteIOps": null,
  92. "CpuPeriod": 0,
  93. "CpuQuota": 0,
  94. "CpuRealtimePeriod": 0,
  95. "CpuRealtimeRuntime": 0,
  96. "CpusetCpus": "",
  97. "CpusetMems": "",
  98. "Devices": [],
  99. "DeviceCgroupRules": null,
  100. "DeviceRequests": null,
  101. "KernelMemory": 0,
  102. "KernelMemoryTCP": 0,
  103. "MemoryReservation": 0,
  104. "MemorySwap": 0,
  105. "MemorySwappiness": null,
  106. "OomKillDisable": false,
  107. "PidsLimit": null,
  108. "Ulimits": null,
  109. "CpuCount": 0,
  110. "CpuPercent": 0,
  111. "IOMaximumIOps": 0,
  112. "IOMaximumBandwidth": 0,
  113. "MaskedPaths": [
  114. "/proc/asound",
  115. "/proc/acpi",
  116. "/proc/kcore",
  117. "/proc/keys",
  118. "/proc/latency_stats",
  119. "/proc/timer_list",
  120. "/proc/timer_stats",
  121. "/proc/sched_debug",
  122. "/proc/scsi",
  123. "/sys/firmware"
  124. ],
  125. "ReadonlyPaths": [
  126. "/proc/bus",
  127. "/proc/fs",
  128. "/proc/irq",
  129. "/proc/sys",
  130. "/proc/sysrq-trigger"
  131. ]
  132. },
  133. "GraphDriver": {
  134. "Data": {
  135. "LowerDir": "/var/lib/docker/overlay2/4a3d8517b6d8e123f3cfe8da699ebcc8782c52cedcd712d1287fcaac782eb9e7-init/diff:/var/lib/docker/overlay2/4e18321fb7be5316984825d9a41de61f7c06a75b93491f000cf5b17b237f2ba0/diff",
  136. "MergedDir": "/var/lib/docker/overlay2/4a3d8517b6d8e123f3cfe8da699ebcc8782c52cedcd712d1287fcaac782eb9e7/merged",
  137. "UpperDir": "/var/lib/docker/overlay2/4a3d8517b6d8e123f3cfe8da699ebcc8782c52cedcd712d1287fcaac782eb9e7/diff",
  138. "WorkDir": "/var/lib/docker/overlay2/4a3d8517b6d8e123f3cfe8da699ebcc8782c52cedcd712d1287fcaac782eb9e7/work"
  139. },
  140. "Name": "overlay2"
  141. },
  142. "Mounts": [],
  143. "Config": {
  144. "Hostname": "5a7267e49878",
  145. "Domainname": "",
  146. "User": "",
  147. "AttachStdin": false,
  148. "AttachStdout": false,
  149. "AttachStderr": false,
  150. "Tty": false,
  151. "OpenStdin": false,
  152. "StdinOnce": false,
  153. "Env": [
  154. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  155. ],
  156. "Cmd": [
  157. "/bin/sh",
  158. "-c",
  159. "while true;do echo zengcheng;sleep 1;done"
  160. ],
  161. "Image": "centos",
  162. "Volumes": null,
  163. "WorkingDir": "",
  164. "Entrypoint": null,
  165. "OnBuild": null,
  166. "Labels": {
  167. "org.label-schema.build-date": "20210915",
  168. "org.label-schema.license": "GPLv2",
  169. "org.label-schema.name": "CentOS Base Image",
  170. "org.label-schema.schema-version": "1.0",
  171. "org.label-schema.vendor": "CentOS"
  172. }
  173. },
  174. "NetworkSettings": {
  175. "Bridge": "",
  176. "SandboxID": "900821d7b36d436d67b16af370453c1338358bf56e34c06ab30c80bfc80e0af6",
  177. "HairpinMode": false,
  178. "LinkLocalIPv6Address": "",
  179. "LinkLocalIPv6PrefixLen": 0,
  180. "Ports": {},
  181. "SandboxKey": "/var/run/docker/netns/900821d7b36d",
  182. "SecondaryIPAddresses": null,
  183. "SecondaryIPv6Addresses": null,
  184. "EndpointID": "8a0c90908317236fd427da77c277e5c0d4326b5f4b23102f9e1044a6cc170202",
  185. "Gateway": "172.17.0.1",
  186. "GlobalIPv6Address": "",
  187. "GlobalIPv6PrefixLen": 0,
  188. "IPAddress": "172.17.0.2",
  189. "IPPrefixLen": 16,
  190. "IPv6Gateway": "",
  191. "MacAddress": "02:42:ac:11:00:02",
  192. "Networks": {
  193. "bridge": {
  194. "IPAMConfig": null,
  195. "Links": null,
  196. "Aliases": null,
  197. "NetworkID": "dcedc9da95eae5f3884380ce741e470ecb5f1b4283e8b479f20732d835f0b7e3",
  198. "EndpointID": "8a0c90908317236fd427da77c277e5c0d4326b5f4b23102f9e1044a6cc170202",
  199. "Gateway": "172.17.0.1",
  200. "IPAddress": "172.17.0.2",
  201. "IPPrefixLen": 16,
  202. "IPv6Gateway": "",
  203. "GlobalIPv6Address": "",
  204. "GlobalIPv6PrefixLen": 0,
  205. "MacAddress": "02:42:ac:11:00:02",
  206. "DriverOpts": null
  207. }
  208. }
  209. }
  210. }
  211. ]

进入正在运行的容器

  1. # 通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
  2. # 命令
  3. docker exec -it 容器id /bin/bash
  4. # 测试
  5. root@DESKTOP-S0IK5KG:/home/cinz# docker exec -it 5a7267e49878 /bin/bash
  6. [root@5a7267e49878 /]# ls
  7. bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
  8. [root@5a7267e49878 /]# es -ef
  9. bash: es: command not found
  10. [root@5a7267e49878 /]# ps -ef
  11. UID PID PPID C STIME TTY TIME CMD
  12. root 1 0 0 10:04 ? 00:00:00 /bin/sh -c while true;do echo zengcheng;sleep 1;done
  13. root 1400 0 0 10:27 pts/0 00:00:00 /bin/bash
  14. root 1428 1 0 10:27 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
  15. root 1429 1400 0 10:27 pts/0 00:00:00 ps -ef
  16. #方式二
  17. #命令
  18. docker attach 容器id
  19. #测试
  20. root@DESKTOP-S0IK5KG:/home/cinz# docker attach 5a7267e49878
  21. 正在执行当前的代码....
  22. # 区别
  23. docker exec # 进入容器后开启一个新的终端,可以在里面操作
  24. docker attach # 进入容器正在执行的终端,不会启动新的进程!

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

  1. #命令
  2. docker cp 容器id:容器内路径 目的地主机路径
  3. #测试
  4. root@DESKTOP-S0IK5KG:/home# docker ps -a
  5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6. 2147f59bbcf5 centos "/bin/bash" 7 minutes ago Up 7 minutes jovial_chebyshev
  7. [root@2147f59bbcf5 home]# exit # 退出容器
  8. root@DESKTOP-S0IK5KG:/home# docker cp 2147f59bbcf5:/home/kuangshen.java /home
  9. root@DESKTOP-S0IK5KG:/home# ls
  10. cinz kuangshen.java # 拷贝成功
  11. # 拷贝是一个手动过程,未来可以使用给-v 卷的技术,可以实现连同

docker run hello-world 流程

Docker - 图2

底层原理

Docker是怎样工作的?
Docker是一个Client - Servcer结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer 接受到Docker-Client的指令,就会执行这个命令!
Docker - 图3

Docker为什么比VM快?

1、Docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势
Docker - 图4

Docker - 图5
2、Docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程。而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
Docker - 图6

小结

Docker - 图7

  1. attach # 当前shell下attach连接指定运行镜像
  2. build # 通过Dockerfile定制镜像
  3. commit # 提交当前容器为新的镜像
  4. cp # 从容器中拷贝指定文件或目录到宿主机中
  5. create # 创建一个新的容器,同 run 但不启动容器
  6. diff # 查看 docker 容器变化
  7. events # 从docker服务器获取容器实时事件
  8. exec # 在已存在的容器上运行命令
  9. export # 导出容器的内容流作为一个 tar 归档文件【对应 import】
  10. history # 展示一个镜像形成历史
  11. images # 列出系统当前镜像
  12. import # 从tar包中的内容创建一个新的文件系统映像【对应 export】
  13. info # 显示系统相关信息
  14. inspect # 查看容器详细信息
  15. kill # kill 指定的容器
  16. load # 从一个 tar 包中加载一个镜像【对应 save】
  17. login # 注册或者登录一个 docker 源服务器
  18. logout # 从当前 Docekr registry 退出
  19. logs # 输出当前容器日志信息
  20. port # 查看映射端口对应的容器内部源端口
  21. pause # 暂停容器
  22. ps # 猎户容器列表
  23. pull # 从docker镜像源服务器拉取指定镜像或者库镜像
  24. push # 推送指定镜像或者库镜像至docker源服务器
  25. restart # 重启运行的容器
  26. rm # 移除一个或多个容器
  27. rmi # 移除一个或多个镜像 (无容器使用该镜像才可删除,否则需要删除相关容器才可继续或 -f 强制删除)
  28. run # 创建一个新的容器并运行一个命令
  29. save # 保存一个镜像为一个 tar 包【对应 load】
  30. search # 在 docker hub 中搜索镜像
  31. start # 启动容器
  32. stop # 停止容器
  33. tag # 给源中镜像打标签
  34. top # 查看容器中运行的进程信息
  35. unpause # 取消暂停容器
  36. version # 查看 docker版本号
  37. wait # 截取容器停止时的退出状态值
  • docker的命令是十分多的,上面学习的那些都是最常用的容器和镜像的命令,之后还会学习很多命令!

> 练习

安装nginx

  1. docker search nginx -f stars=100 # 搜索nginx stars>=100的镜像
  2. docker pull nginx # 拉取 nginx镜像
  3. docker run -d --name nginx -p 8000:80 nginx # 运行镜像 内部端口8000:外部端口80
  4. # -d 后台运行
  5. # --name 给容器明明
  6. # -p 宿主机端口:容器内部端口
  7. docker ps # 查看是否运行
  8. curl localhost:8000 # curl 模拟 GET\POST 请求,查看是否成功
  9. # 浏览器输入 localhost:8000 即可访问
  10. # 进入容器
  11. docker exec -it nginx /bin/bash
  12. cd /etc/nginx
  13. # 修改 nginx配置
  14. vim nginx.conf

端口暴露的概念

Docker - 图8
思考:我们每次修改nginx配置文件,都需要进入容器内部,十分的麻烦,如果可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改 -v 数据卷

安装Tomcat

  1. # 官方的使用
  2. docker run -it --rm tomcat:9.0
  3. # 我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it --rm,一般用来测试,用完就会自动删除
  4. #下载再启动
  5. docker pull tomat:9.0
  6. #启动运行
  7. docker run -d --name tomcat9 -p 8001:8080 tomcat
  8. #测试访问 localhost:8001 ,进入成功则无问题
  9. #进入容器
  10. docker exec -it tomcat9 /bin/bash
  11. #发现问题:1、linux命令少了;2、webapps目录下没有文件导致访问404
  12. #原因 阿里云镜像默认是最小的镜像,所有不必要的都剔除掉,保证最小的运行环境
  13. # 解决访问404的一些办法,进入tomcat容器,将webapps.dist下的文件,拷贝到webapps下
  14. docker exec -it tomcat9 /bin/bash # 进入容器
  15. cd /usr/local/tomcat # 进入tomcat
  16. cp -r webapps.dist/* webapps # 文件拷贝

问题:重复命名并且已删除原镜像依旧提示名称重复的解决方案

  1. # 清除所有未使用或悬空的图像,容器,卷和网络
  2. # Docker提供了一个命令,可以清理悬空的任何资源(图像,容器,卷和网络)(与容器无关):
  3. docker system prune
  4. # 要另外删除任何已停止的容器和所有未使用的图像(不只是悬空图像),请将该-a标志添加到命令:
  5. docker system prune -a

思考问题:我们以后要部署项目,每次都要进入容器十分麻烦,如果可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改 -v 数据卷

部署 es + kibana

  1. # es 暴露的端口很多
  2. # es 十分的耗内存
  3. # es 的数据一般需要放置到安全目录挂载
  4. # -- net somenetwork 网络配置
  5. docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
  6. # 如果内存太小,启动elasticsearch linux就卡住了 ,可以使用 docker stats 查看cpu的状态,此时本机32GB内存,elasticsearch占了8G
  7. # 测试elasticsearch是否成功
  8. root@DESKTOP-S0IK5KG:/home/cinz# curl localhost:9200 # 成功
  9. {
  10. "name" : "71c524f6c2b3",
  11. "cluster_name" : "docker-cluster",
  12. "cluster_uuid" : "I-5BHooXTu6EHGKYw4xZAQ",
  13. "version" : {
  14. "number" : "7.6.2",
  15. "build_flavor" : "default",
  16. "build_type" : "docker",
  17. "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
  18. "build_date" : "2020-03-26T06:34:37.794943Z",
  19. "build_snapshot" : false,
  20. "lucene_version" : "8.4.0",
  21. "minimum_wire_compatibility_version" : "6.8.0",
  22. "minimum_index_compatibility_version" : "6.0.0-beta1"
  23. },
  24. "tagline" : "You Know, for Search"
  25. }

内存占用
Docker - 图9

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

使用Kbana连接es

Docker - 图10

可视化

- portainer

什么是portainer?

Docker图形化界面管理工具!提供一个后台面板共我们操作

  1. docker run -d -p 8088:9000 \
  2. --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试 ip:8088
出现以下画面则成功
Docker - 图11
选择本地
Docker - 图12
内部界面
Docker - 图13

  • Rancher(CI/CD)