写在前面

自己在 Mac 上配置 docker 和熟悉基本操作的过程中,参考教程资料会遇到和我实际情况略有不一的地方,所以做个记录方便理解和查看。Docker 在 ubuntu win mac 上 UI 等略有不同或者它们本身也在变化,进一步对比参考资料可以解决。过程中主要参考了菜鸟教程的 docker 教程

Docker

Docker 的很多介绍不再说了,有镜像和容器的概念,一定程度上可以将“容器”理解为是“镜像”的实例。本篇中基本都是 shell 里面的,为了注释方便我就用的 # 做注释。

  • 我最初为了快速没有配置 brew,采用下载方式安装,下载链接,下载之后有 UI 界面的;
  • 镜像加速在设置中,即 json 配置文件,添加:
"registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]

然后应用重启生效。

在这里插入图片描述

Hello world

# 以镜像 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
  • 后台模式启动 docker
(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

docker 运行 web 应用

# -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 镜像使用

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
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐