自己在 Mac 上配置 docker 和熟悉基本操作的过程中,参考教程资料会遇到和我实际情况略有不一的地方,所以做个记录方便理解和查看。Docker 在 ubuntu win mac 上 UI 等略有不同或者它们本身也在变化,进一步对比参考资料可以解决。过程中主要参考了菜鸟教程的 docker 教程
Docker 的很多介绍不再说了,有镜像和容器的概念,一定程度上可以将“容器”理解为是“镜像”的实例。本篇中基本都是 shell 里面的,为了注释方便我就用的 # 做注释。
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
然后应用重启生效。
# 以镜像 ubuntu:16.04 “实例” 化容器,然后在容器里面执行语句,然后输出 “Hello world”
(base) NanaLvs-MacBook-Pro:~ username$ docker run ubuntu:16.04 /bin/echo "Hello world"
# 第一次用 ubuntu:16.04 本地没有这个镜像,docker 会自动从 hub 上获取
# 获取后就会执行语句,如果使用 docker images 可以查看本地已有的 docker 镜像
Unable to find image 'ubuntu:16.04' locally
16.04: Pulling from library/ubuntu
16.04: Pulling from library/ubuntu
828b35a09f0b: Pull complete
238e9b8fdf46: Pull complete
1d5b1b491959: Pull complete
269a6c6175ba: Pull complete
Digest: sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c
Status: Downloaded newer image for ubuntu:16.04
# 输出结果
Hello world
# -i 允许交互 -t 使用终端或者伪终端 后面还会经常用到 -d 指的是后台运行容器,不直接进入容器交互
(base) NanaLvs-MacBook-Pro:~ username$ docker run -i -t ubuntu:16.04 /bin/bash
# 已经进入容器,查看系统版本
root@202e28ad3ec5:/# cat /proc/version
Linux version 5.10.76-linuxkit (root@buildkitsandbox) (gcc (Alpine 10.2.1_pre1) 10.2.1 20201203, GNU ld (GNU Binutils) 2.35.2) #1 SMP PREEMPT Mon Nov 8 11:22:26 UTC 2021
root@202e28ad3ec5:/# ls
bin dev home media opt root sbin sys usr
boot etc lib mnt proc run srv tmp var
# 退出容器
root@202e28ad3ec5:/# exit
exit
(base) NanaLvs-MacBook-Pro:~ username$ docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
c03dd3eb0cd3d016d6eb70248bccae7484e252867502b15975f57274e3552a26
# 依次是容器id、使用的镜像、启动容器时运行的命令、容器的创建时间、目前容器的状态
# 状态有 7 种:created/restarting/running or up/removing/paused/exited/dead
(base) NanaLvs-MacBook-Pro:~ username$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c03dd3eb0cd3 ubuntu:16.04 "/bin/sh -c 'while t…" 5 seconds ago Up 4 seconds mystifying_leavitt
(base) NanaLvs-MacBook-Pro:~ username$ docker logs c03dd3eb0cd3
hello world
hello world
hello world
...
# 停止容器的运行
(base) NanaLvs-MacBook-Pro:~ username$ docker stop c03dd3eb0cd3
c03dd3eb0cd3
(base) NanaLvs-MacBook-Pro:~ username$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 如果本地没有对应镜像,可以 docker pull 指定拉取
$ docker pull ubuntu
# 使用 ubuntu 镜像启动一个容器,参数为 -it 以命令行模式进入该容器
$ docker run -it ubuntu /bin/bash
# 根据 container id 和 names 可以操作对应容器
# 大部分时候需要后台运行,所以用 -d,默认就不会进入容器,如果想进去容器可以用 attach 和 exec(推荐)
$ docker run -itd --name container_name image_name /bin/bash
# 如果使用 docker attach,操作之后退出就停止容器运行
$ docker attach id or name
# 如果使用 docker exec,操作之后退出可以不影响容器运行(推荐)
$ docker exec -it id or name /bin/bash
# 停止/重启/启动/删除指定容器,可以使用 id 也可以用 name,加上 -f 表示 force,强制删除
$ docker stop id or name
$ docker restart id or name
$ docker start id or name
$ docker rm id or name
# -P 将容器内部使用的网络端口随机映射到我们使用的主机上
$ docker pull training/webapp
$ docker run -d -P training/webapp python app.py
# 查看 docker 信息可以看见 PORTS 信息
(base) NanaLvs-MacBook-Pro:~ username$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e2a392de6cc training/webapp "python app.py" 5 minutes ago Up 5 minutes 0.0.0.0:55000->5000/tcp modest_beaver
# 查询端口映射,映射到本机 55000 端口
(base) NanaLvs-MacBook-Pro:~ username$ docker port 4e2a392de6cc
5000/tcp -> 0.0.0.0:55000
# 查看 web 应用程序日志
(base) NanaLvs-MacBook-Pro:~ username$ docker logs -f 4e2a392de6cc
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [21/Dec/2021 04:13:25] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [21/Dec/2021 04:15:39] "GET / HTTP/1.1" 200 -
...
# 检查 web 应用程序
$ docker inspect id or name
在浏览器中输入自己本地 ip + 上面对应端口就可以看到结果:
docker 镜像查询网址
# 查看当前拥有的所有镜像
(base) NanaLvs-MacBook-Pro:~ username$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 fe3b34cb9255 2 months ago 119MB
ubuntu latest d5ca7a445605 2 months ago 65.6MB
training/webapp latest 6fae60ef3446 6 years ago 349MB
# 想要新的镜像,可以在官网查询,也可以命令查询
# 返回依次是 镜像名/描述/是否官方/stars...
(base) NanaLvs-MacBook-Pro:~ username$ docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3804 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 40
centos/httpd 34 [OK]
arm32v7/httpd The Apache HTTP Server Project 10
# 拉取最上面的 httpd,不填写 tag 时默认拉取最新的 latest
(base) NanaLvs-MacBook-Pro:~ username$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
latest: Pulling from library/httpd
927a35006d93: Pull complete
54884dde3e72: Pull complete
83293d424336: Pull complete
35cfaf978834: Pull complete
8057a130ac24: Pull complete
Digest: sha256:d2b8cb5614bac9981aa1a843a684279039f5837001b4517df6a56778be1fe9d1
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
(base) NanaLvs-MacBook-Pro:~ username$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 1c2ff9e4eb7d 5 hours ago 136MB
ubuntu 16.04 fe3b34cb9255 2 months ago 119MB
ubuntu latest d5ca7a445605 2 months ago 65.6MB
training/webapp latest 6fae60ef3446 6 years ago 349MB
# 删除已有的 image 用 rmi
(base) NanaLvs-MacBook-Pro:~ username$ docker rmi hello-world
# 创建自己的镜像,通过修改的方式
# 创建 ubuntu 16.04 容器并进去之后进行更新
(base) NanaLvs-MacBook-Pro:~ username$ docker run -t -i ubuntu:16.04 /bin/bash
root@8d9b301e5ffe:/# apt-get update
Get:1 http://ports.ubuntu.com/ubuntu-ports xenial InRelease [247 kB]
...
# 退出后查询这个容器的 id,然后将其提交为新的镜像
(base) NanaLvs-MacBook-Pro:~ username$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d9b301e5ffe ubuntu:16.04 "/bin/bash" About a minute ago Exited (0) 4 seconds ago fervent_shaw
06e1b7d1b34f ubuntu:16.04 "/bin/bash" 10 minutes ago Exited (0) 10 minutes ago nifty_roentgen
# -m 备注 -a 作者信息 容器id 容器名和 tag
(base) NanaLvs-MacBook-Pro:~ username$ docker commit -m="has update" -a="lxd" 8d9b301e5ffe lxd/ubuntu:v2
sha256:7b9a5b34f72654639812be15cc51341e9494be1a56064cd82c162937a75f6bea
# 下面 lxd/ubuntu 就是刚刚创建的新镜像
(base) NanaLvs-MacBook-Pro:~ username$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lxd/ubuntu v2 7b9a5b34f726 8 seconds ago 146MB
httpd latest 1c2ff9e4eb7d 5 hours ago 136MB
ubuntu 16.04 fe3b34cb9255 2 months ago 119MB
ubuntu latest d5ca7a445605 2 months ago 65.6MB
training/webapp latest 6fae60ef3446 6 years ago 349MB
# 用这个新镜像创建容器
(base) NanaLvs-MacBook-Pro:~ username$ docker run -it lxd/ubuntu:v2 /bin/bash
root@a122baa2c857:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
# 创建自己的镜像,通过 Dockerfile 完全从头创建的方式
# TODO 出错了,赶时间,暂时略过
# 设置镜像标签 为 lxd/ubuntu 添加一个 tag 为 v3
(base) NanaLvs-MacBook-Pro:~ username$ docker tag 7b9a5b34f726 lxd/ubuntu:v3
# 可以看到下面 id 为 7b9a5b34f726 现在有两个 tag,分别是 v2 和 v3
(base) NanaLvs-MacBook-Pro:~ username$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lxd/ubuntu v2 7b9a5b34f726 8 minutes ago 146MB
lxd/ubuntu v3 7b9a5b34f726 8 minutes ago 146MB
httpd latest 1c2ff9e4eb7d 5 hours ago 136MB
ubuntu 16.04 fe3b34cb9255 2 months ago 119MB
ubuntu latest d5ca7a445605 2 months ag