Docker学习笔记

一、Docker镜像管理

常用基础命令

1. 登录镜像仓库:

docker login 
1 [root@host-yht ~]# docker login docker.io
2 Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
3 Username: yht148665
4 Password: 
5 WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
6 Configure a credential helper to remove this warning. See
7 https://docs.docker.com/engine/reference/commandline/login/#credentials-store
8 
9 Login Succeeded

 

2. 查看所有本地的主机上的镜像:

docker images

 

3. 搜索镜像:

docker search 镜像名

 

4. 下载镜像:

   直接下载:

dockers pull 镜像名

指定下载:

1 [root@host-yht ~]# docker pull alpine:3.10.1
2 3.10.1: Pulling from library/alpine
3 050382585609: Pull complete 
4 Digest: sha256:6a92cd1fcdc8d8cdec60f33dda4db2cb1fcdcacf3410a8e05b3741f44a9b5998
5 Status: Downloaded newer image for alpine:3.10.1
6 docker.io/library/alpine:3.10.1 

 镜像结构:registry_name/repository_name/image_name:tag_name

例如:docker.io/library/alpine

5. 给镜像打标签:

docker tag  容器id  新标签
 1 [root@host-yht ~]# docker images
 2 REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
 3 alpine       latest    14119a10abf4   2 weeks ago    5.6MB
 4 centos       latest    300e315adb2f   9 months ago   209MB
 5 [root@host-yht ~]# docker tag 14119a10abf4 docker.io/library/alpine:new_latest
 6 [root@host-yht ~]# docker images
 7 REPOSITORY   TAG          IMAGE ID       CREATED        SIZE
 8 alpine       latest       14119a10abf4   2 weeks ago    5.6MB
 9 alpine       new_latest   14119a10abf4   2 weeks ago    5.6MB
10 centos       latest       300e315adb2f   9 months ago   209MB

 

6. 删除镜像:

docker rmi 镜像id

 

 

二、Docker容器基本操作

1. 查看容器

1.1 查看运行中的容器

docker ps

1.2 查看运行所有容器

docker ps -a
[root@host-yht ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS                   PORTS     NAMES
d7aac98d290d   centos    "/bin/bash"   10 days ago   Exited (0) 10 days ago             romantic_antonelli

 

 

2. 启动容器(运行镜像)

docker run 

命令格式: docker  run  [OPTIONS]  image  [COMMAND]  [ARG...]

-i :表示启动一个可以交互的容器,并持续打开标准输入

-p:宿主机端口与容器中端口进行映射

-d:后台启动容器

--name:指定容器名称

2.1 交互式启动一个容器

[root@host-yht ~]# docker run -ti centos /bin/sh
sh-4.4# 

已经启动,换一个终端查看:

[root@host-yht ~]# docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS          PORTS     NAMES
5629c321f516   centos    "/bin/sh"   52 seconds ago   Up 50 seconds             kind_dijkstra

然后就可以在启动的容器进行交互:例如查看当前路径,ip,文件夹等等

 1 sh-4.4# ls -a
 2 .  ..  .dockerenv  bin    dev  etc  home    lib  lib64  lost+found    media  mnt  opt  proc  root  run  sbin    srv  sys  tmp  usr  var
 3 sh-4.4# ip add
 4 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 5     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 6     inet 127.0.0.1/8 scope host lo
 7        valid_lft forever preferred_lft forever
 8 8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
 9     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
10     inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
11        valid_lft forever preferred_lft forever 

2.2 非交互式启动一个容器

1 [root@host-yht ~]# docker run --rm centos /bin/echo hello
2 hello
3 [root@host-yht ~]# docker ps -a
4 CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
5 5629c321f516   centos    "/bin/sh"     22 minutes ago   Exited (0) 15 minutes ago             kind_dijkstra
6 61c3342c7b0f   centos    "/bin/sh"     29 minutes ago   Exited (0) 26 minutes ago             sweet_napier
7 d7aac98d290d   centos    "/bin/bash"   10 days ago      Exited (0) 10 days ago                romantic_antonelli
8 
9 直接输出hello并关闭,--rm : 不会出现在启动历史中

2.3非交互启动一个后台容器

这儿有一个小坑

1 [root@host-yht ~]# docker run -d --name mycentos centos
2 04094b1f1f6770a4a1f5a30ed2f2852f608abba09f8b406fdb770b8eeaff10c1
3 [root@host-yht ~]# docker ps -a
4 CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
5 04094b1f1f67   centos    "/bin/bash"   7 seconds ago    Exited (0) 5 seconds ago              mycentos

 你会发现明明是启动后挂在后台,却被马上关闭。这是因为这个容器要是没有提供服务就会马上停止运行

 如果我写一个循环输出让其一直运行:

1 [root@host-yht ~]# docker run -d centos /bin/sh -c "while true;do echo host;sleep 2;done"
2 09ba623140bbbc8ccb89ead4613b682367538fb3c18c65377c3bc3a61caa30af
3 [root@host-yht ~]# docker ps -a
4 CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS                         PORTS     NAMES
5 09ba623140bb   centos    "/bin/sh -c 'while t…"   11 seconds ago      Up 10 seconds                            romantic_jones

这个容器就在后台运行着。

 

3. 在宿主机查看寄生机进程

1 [root@host-yht ~]# docker run -d centos /bin/sh -c "while true;do echo host;sleep 2;done"
2 faf874eb3b131523056897d467f82b5c951b1b07e26d50d3ffd49dcec575246b
3 [root@host-yht ~]# ps aux|grep while|grep -v grep
4 root       3530  0.0  0.1  11880  1536 ?        Ss   18:27   0:00 /bin/sh -c while true;do echo host;sleep 2;done

 

 

4. 进入当前正在运行的容器

4.1 进入容器后开启一个新的终端

docker exec -it 容器id /bin/bash
1 [root@host-yht ~]# docker exec -it 55a2c9b30dfd /bin/bash
2 [root@55a2c9b30dfd /]# 

4.2 进入容器正在执行的终端

docker attach 容器id
 1 [root@host-yht ~]# docker attach 55a2c9b30dfd
 2 host
 3 host
 4 host
 5 host
 6 host
 7 host
 8 host
 9 host
10 host
11 host
12 host
13 正在不停的输出字符串host

 

 

5.启动,重启,停止容器

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

 

 

6. 删除容器

# 删除指定容器,不能删除正在运行的容器
docker rm 容器id
 1 [root@host-yht ~]# docker ps -a
 2 CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
 3 55a2c9b30dfd   centos    "/bin/sh -c 'while t…"   22 minutes ago   Exited (137) 10 minutes ago             suspicious_chaum
 4 faf874eb3b13   centos    "/bin/sh -c 'while t…"   28 minutes ago   Exited (137) 24 minutes ago             beautiful_golick
 5 09ba623140bb   centos    "/bin/sh -c 'while t…"   40 minutes ago   Exited (137) 38 minutes ago             romantic_jones
 6 04094b1f1f67   centos    "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                  mycentos
 7 5629c321f516   centos    "/bin/sh"                2 hours ago      Exited (0) 2 hours ago                  kind_dijkstra
 8 61c3342c7b0f   centos    "/bin/sh"                3 hours ago      Exited (0) 3 hours ago                  sweet_napier
 9 d7aac98d290d   centos    "/bin/bash"              10 days ago      Exited (0) 10 days ago                  romantic_antonelli
10 [root@host-yht ~]# docker rm 55a2c9b30dfd
11 55a2c9b30dfd
12 [root@host-yht ~]# docker ps -a
13 CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
14 faf874eb3b13   centos    "/bin/sh -c 'while t…"   28 minutes ago   Exited (137) 25 minutes ago             beautiful_golick
15 09ba623140bb   centos    "/bin/sh -c 'while t…"   41 minutes ago   Exited (137) 39 minutes ago             romantic_jones
16 04094b1f1f67   centos    "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                  mycentos
17 5629c321f516   centos    "/bin/sh"                2 hours ago      Exited (0) 2 hours ago                  kind_dijkstra
18 61c3342c7b0f   centos    "/bin/sh"                3 hours ago      Exited (0) 3 hours ago                  sweet_napier
19 d7aac98d290d   centos    "/bin/bash"              10 days ago      Exited (0) 10 days ago                  romantic_antonelli

6.1 删除运行中的容器

docker rm -f 容器id
 1 [root@host-yht ~]# docker run -d centos /bin/sh -c "while true;do echo host;sleep 2;done"
 2 8818135fb077657082201706859436ca4430072ba36c27514befb72d9060637a
 3 [root@host-yht ~]# docker ps -a
 4 CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
 5 8818135fb077   centos    "/bin/sh -c 'while t…"   3 seconds ago    Up 2 seconds                            dazzling_satoshi
 6 faf874eb3b13   centos    "/bin/sh -c 'while t…"   30 minutes ago   Exited (137) 27 minutes ago             beautiful_golick
 7 09ba623140bb   centos    "/bin/sh -c 'while t…"   43 minutes ago   Exited (137) 41 minutes ago             romantic_jones
 8 04094b1f1f67   centos    "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                  mycentos
 9 5629c321f516   centos    "/bin/sh"                2 hours ago      Exited (0) 2 hours ago                  kind_dijkstra
10 61c3342c7b0f   centos    "/bin/sh"                3 hours ago      Exited (0) 3 hours ago                  sweet_napier
11 d7aac98d290d   centos    "/bin/bash"              10 days ago      Exited (0) 10 days ago                  romantic_antonelli
12 [root@host-yht ~]# docker rm -f 8818135fb077
13 8818135fb077
14 [root@host-yht ~]# docker ps -a
15 CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
16 faf874eb3b13   centos    "/bin/sh -c 'while t…"   31 minutes ago   Exited (137) 28 minutes ago             beautiful_golick
17 09ba623140bb   centos    "/bin/sh -c 'while t…"   44 minutes ago   Exited (137) 42 minutes ago             romantic_jones
18 04094b1f1f67   centos    "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                  mycentos
19 5629c321f516   centos    "/bin/sh"                2 hours ago      Exited (0) 2 hours ago                  kind_dijkstra
20 61c3342c7b0f   centos    "/bin/sh"                3 hours ago      Exited (0) 3 hours ago                  sweet_napier
21 d7aac98d290d   centos    "/bin/bash"              10 days ago      Exited (0) 10 days ago                  romantic_antonelli

6.2 常用的一个命令,删除所有停止的容器

for i in `docker ps -a|grep -i exit|sed '1d'|awk '{print $1}'`;do docker rm -f $i;done
 1 [root@host-yht ~]# docker ps -a
 2 CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
 3 faf874eb3b13   centos    "/bin/sh -c 'while t…"   35 minutes ago   Exited (137) 31 minutes ago             beautiful_golick
 4 09ba623140bb   centos    "/bin/sh -c 'while t…"   47 minutes ago   Exited (137) 45 minutes ago             romantic_jones
 5 04094b1f1f67   centos    "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                  mycentos
 6 5629c321f516   centos    "/bin/sh"                3 hours ago      Exited (0) 2 hours ago                  kind_dijkstra
 7 61c3342c7b0f   centos    "/bin/sh"                3 hours ago      Exited (0) 3 hours ago                  sweet_napier
 8 d7aac98d290d   centos    "/bin/bash"              10 days ago      Exited (0) 10 days ago                  romantic_antonelli
 9 [root@host-yht ~]# for i in `docker ps -a|grep -i exit|sed '1d'|awk '{print $1}'`;do docker rm -f $i;done
10 09ba623140bb
11 04094b1f1f67
12 5629c321f516
13 61c3342c7b0f
14 d7aac98d290d

 6.3 删除所有容器

1 docker rm -f $(docker ps -qa)

 

 

 

7. 修改/提交容器

7.1 修改容器

1 [root@host-yht ~]# docker run -it --name centos20219181029 centos /bin/sh
2 sh-4.4# ls /
3 bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
4 sh-4.4# echo hello > test.txt
5 sh-4.4# ls /
6 bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  test.txt  tmp  usr  var
7 sh-4.4# cat test.txt
8 hello

注意:这种修改只会保存在本容器,并不会保存到镜像

1 [root@host-yht ~]# docker run -it centos /bin/sh
2 sh-4.4# ls /
3 bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

7.2 提交容器

1 docker commit -p [你要提交的容器名] [镜像名字]
1 [root@host-yht ~]# docker commit -p centos20219181029 new_centos_test.txt
2 sha256:d6ec9fd15562cbe6317a19d8214e6accf6e3a74148b57800aabfbf6f40b9e16f
3 [root@host-yht ~]# docker images
4 REPOSITORY            TAG          IMAGE ID       CREATED         SIZE
5 new_centos_test.txt   latest       d6ec9fd15562   8 seconds ago   209MB
6 alpine                latest       14119a10abf4   3 weeks ago     5.6MB
7 alpine                new_latest   14119a10abf4   3 weeks ago     5.6MB
8 centos                latest       300e315adb2f   9 months ago    209MB
9 alpine                3.10.1       b7b28af77ffe   2 years ago     5.58MB

此时容器已经被提交成了一个镜像,去看一下这个镜像里面有没有test.txt文件

1 [root@host-yht ~]# docker run -it new_centos_test.txt /bin/sh
2 sh-4.4# ls /
3 bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  test.txt  tmp  usr  var
4 sh-4.4# cat test.txt
5 hello

有!说明之前的centos镜像被修改并保存为一个新的镜像

 

 

8. 查看容器详细信息

1 docker inspect 容器名

 

  1 [root@host-yht ~]# docker inspect centos
  2 [
  3     {
  4         "Id": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
  5         "RepoTags": [
  6             "centos:latest"
  7         ],
  8         "RepoDigests": [
  9             "centos@sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1"
 10         ],
 11         "Parent": "",
 12         "Comment": "",
 13         "Created": "2020-12-08T00:22:53.076477777Z",
 14         "Container": "395e0bfa7301f73bc994efe15099ea56b8836c608dd32614ac5ae279976d33e4",
 15         "ContainerConfig": {
 16             "Hostname": "395e0bfa7301",
 17             "Domainname": "",
 18             "User": "",
 19             "AttachStdin": false,
 20             "AttachStdout": false,
 21             "AttachStderr": false,
 22             "Tty": false,
 23             "OpenStdin": false,
 24             "StdinOnce": false,
 25             "Env": [
 26                 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 27             ],
 28             "Cmd": [
 29                 "/bin/sh",
 30                 "-c",
 31                 "#(nop) ",
 32                 "CMD [\"/bin/bash\"]"
 33             ],
 34             "Image": "sha256:6de05bdfbf9a9d403458d10de9e088b6d93d971dd5d48d18b4b6758f4554f451",
 35             "Volumes": null,
 36             "WorkingDir": "",
 37             "Entrypoint": null,
 38             "OnBuild": null,
 39             "Labels": {
 40                 "org.label-schema.build-date": "20201204",
 41                 "org.label-schema.license": "GPLv2",
 42                 "org.label-schema.name": "CentOS Base Image",
 43                 "org.label-schema.schema-version": "1.0",
 44                 "org.label-schema.vendor": "CentOS"
 45             }
 46         },
 47         "DockerVersion": "19.03.12",
 48         "Author": "",
 49         "Config": {
 50             "Hostname": "",
 51             "Domainname": "",
 52             "User": "",
 53             "AttachStdin": false,
 54             "AttachStdout": false,
 55             "AttachStderr": false,
 56             "Tty": false,
 57             "OpenStdin": false,
 58             "StdinOnce": false,
 59             "Env": [
 60                 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 61             ],
 62             "Cmd": [
 63                 "/bin/bash"
 64             ],
 65             "Image": "sha256:6de05bdfbf9a9d403458d10de9e088b6d93d971dd5d48d18b4b6758f4554f451",
 66             "Volumes": null,
 67             "WorkingDir": "",
 68             "Entrypoint": null,
 69             "OnBuild": null,
 70             "Labels": {
 71                 "org.label-schema.build-date": "20201204",
 72                 "org.label-schema.license": "GPLv2",
 73                 "org.label-schema.name": "CentOS Base Image",
 74                 "org.label-schema.schema-version": "1.0",
 75                 "org.label-schema.vendor": "CentOS"
 76             }
 77         },
 78         "Architecture": "amd64",
 79         "Os": "linux",
 80         "Size": 209348104,
 81         "VirtualSize": 209348104,
 82         "GraphDriver": {
 83             "Data": {
 84                 "MergedDir": "/var/lib/docker/overlay2/cf1b3d5cc4ce7ee242b28d148e9ffba6ecf68d9bc2e3b3ffda5055e8724b9e0f/merged",
 85                 "UpperDir": "/var/lib/docker/overlay2/cf1b3d5cc4ce7ee242b28d148e9ffba6ecf68d9bc2e3b3ffda5055e8724b9e0f/diff",
 86                 "WorkDir": "/var/lib/docker/overlay2/cf1b3d5cc4ce7ee242b28d148e9ffba6ecf68d9bc2e3b3ffda5055e8724b9e0f/work"
 87             },
 88             "Name": "overlay2"
 89         },
 90         "RootFS": {
 91             "Type": "layers",
 92             "Layers": [
 93                 "sha256:2653d992f4ef2bfd27f94db643815aa567240c37732cae1405ad1c1309ee9859"
 94             ]
 95         },
 96         "Metadata": {
 97             "LastTagTime": "0001-01-01T00:00:00Z"
 98         }
 99     }
100 ]

 

 

 9. 查看容器内服务运行日志

1 docker logs [参数] [容器id或者容器名称]
2 -t               加入时间戳
3 -f               跟随最新的日志打印
4 --tail [数字]     显示日志最后多少条

9.1非实时展示日志

1 //先运行一个容器
2 [root@host-yht ~]# docker run -ti --name centoslog centos /bin/bash
 1 //这是我启动一个容器后随便运行的一些命令
 2 [root@host-yht ~]# docker run -ti --name centoslog centos /bin/bash
 3 [root@3866f954ba31 /]# pwd
 4 /
 5 [root@3866f954ba31 /]# ls 
 6 bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
 7 //然后我再开了一个终端查看该容器的日志,然后我上面的操作被全部打印了出来
 8 [root@host-yht ~]# docker logs 3866f954ba31
 9 [root@3866f954ba31 /]# pwd
10 /
11 [root@3866f954ba31 /]# ls 
12 bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
13 [root@host-yht ~]# 

9.2 实时展示日志

 1 //我先运行一个在后台不断循环输出“host”的容器,然后查看实时日志
 2 [root@host-yht ~]# docker run -d --name centoslog03 centos /bin/sh -c "while true;do echo host;sleep 2;done"
 3 45e871be80cf977b5a0f3daf41eae327f4c06e316f13a6a1e38182d1c3e9ad1d
 4 [root@host-yht ~]# docker logs -ft 45e871be80cf9
 5 2021-09-28T13:17:49.904892508Z host
 6 2021-09-28T13:17:51.908188217Z host
 7 2021-09-28T13:17:53.910492251Z host
 8 2021-09-28T13:17:55.913371613Z host
 9 2021-09-28T13:17:57.916666061Z host
10 2021-09-28T13:17:59.919452129Z host
11 2021-09-28T13:18:01.923888149Z host
12 2021-09-28T13:18:03.929818221Z host
13 2021-09-28T13:18:05.935444080Z host
14 2021-09-28T13:18:07.938024834Z host
15 2021-09-28T13:18:09.940612659Z host
16 2021-09-28T13:18:11.942971704Z host
17 2021-09-28T13:18:13.946641989Z host
18 2021-09-28T13:18:15.951187453Z host
19 2021-09-28T13:18:17.953812936Z host
20 2021-09-28T13:18:19.957559482Z host
21 2021-09-28T13:18:21.963196108Z host

 

10. 查看容器内进程

1 docker top 容器id或者容器名
1 [root@host-yht ~]# docker start mycentos
2 mycentos
3 [root@host-yht ~]# docker top mycentos
4 UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
5 root                3800                3780                0                   21:28               pts/0               00:00:00            /bin/bash

 

11. 在宿主机与容器之间传输文件

11.1 将宿主机文件传入容器内:

1 docker cp [宿主机文件路径] [容器名或者id]:[容器文件路径]

1、我在宿主机上下载一个jdk

2、然后将其传到centos中

1 wget  https://repo.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz
2 [root@host-yht yht]# ls -a
3 .  ..  .bash_logout  .bash_profile  .bashrc  jdk-8u181-linux-x64.tar.gz  .mozilla
1 1 //启动一个容器
2 2 docker run -ti --name mycentos centos /bin/bash
3 [root@a4bd7e9d9f4a /]# ls -a
4 .  ..  .dockerenv  bin    dev  etc  home    lib  lib64  lost+found    media  mnt  opt  proc  root  run  sbin    srv  sys  tmp  usr  var
1 //传输
2 [root@host-yht yht]# docker cp /home/yht/jdk-8u181-linux-x64.tar.gz mycentos:/
//容器中查看,传输成功
1
[root@a4bd7e9d9f4a /]# ls -a 2 . .. .dockerenv bin dev etc home jdk-8u181-linux-x64.tar.gz lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

11.2  将容器中的文件传入宿主机:

1 docker cp [容器名或者id]:[容器文件路径] [宿主机文件路径] 
 1 //进入一个正在运行的容器并创建一个txt文件
 2 [root@host-yht ~]# docker exec -ti mycentos bash
 3 [root@a4bd7e9d9f4a usr]# touch test.txt
 4 [root@a4bd7e9d9f4a usr]# ls
 5 bin  games  include  lib  lib64  libexec  local  rongqi-  sbin    share  src  test.txt  tmp
 6 //退出容器(不停止并退出方式见上面代码)并在宿主机输入代码,将这个文件传入到宿主机中
 7 [root@host-yht yht]# docker cp mycentos:/usr/test.txt /home/yht
 8 //查看
 9 [root@host-yht yht]# ls
10 jdk-8u181-linux-x64.tar.gz  test.txt

 

 

12. 数据卷使用

作用:实现宿主机系统与容器之间的文件共享

例如我可以通过宿主机直接对容器做出改变

必须要在启动容器前或者启动容器中绑定数据卷

12.1 第一种数据卷使用方式

自定义数据卷目录:

1 docker run -v [宿主机目录:容器目录] [镜像名]  //注意:目录必须是绝对路径
1 //首先,我提前在宿主机上创建了一个volume_test的目录    /home/yht/volume_test
1 [root@host-yht yht]# docker run -ti --name centosVol -v /home/yht/volume_test:/home centos bash
2 [root@cf2fdad44934 /]# cd /home
3 [root@cf2fdad44934 home]# ls -a
4 .  ..

绑定之后且已经进到容器中,进入/home中查看此时没有任何东西,

现在开始对宿主机目录/home/yht/volume_test进行修改:

1 [root@host-yht /]# cd /home/yht/volume_test
2 [root@host-yht volume_test]# touch test.txt
3 [root@host-yht volume_test]# vim test.txt
4 //进入test.txt文件编辑了“hello world”,此处省略了

再看看容器内目录/home会发生什么改变:

1 [root@cf2fdad44934 home]# ls
2 test.txt
3 [root@cf2fdad44934 home]# cat test.txt
4 hello world!!!

 

直接文件共享!!!!

注意:这种方式会把你容器中的文件清空,因为它和你宿主机文件是同步的,你在宿主机中指定了一个新的空文件夹,同步过去肯定会将你指定容器中的目录同步为空

12.2 第二种数据卷使用方术

自动数据卷目录:

1 docker run -v [随便名:容器目录] [镜像名]
2 例如:docker run -ti -v aa:[容器目录] centos bash

注意:

1、 aa代表一个数据卷的名字,名称可以随便写,docker在不存在这个目录时会自动创建这个数据卷并会同时映射宿主机某个目录

2、优点:这个方式会在你启动容器的时候会将aa对应容器目录中全部内容备份到aa中

 1 [root@host-yht yht]# docker run -d --name centosVol02 -v aa:/bin centos
 2 1b6a2e1fb5ddbd042572728fe0806dfb96002ccc518f70f83f60ed61e3bfd395
 3 //找到aa目录
 4 [root@host-yht yht]# find / -name aa
 5 /var/lib/docker/overlay2/cf1b3d5cc4ce7ee242b28d148e9ffba6ecf68d9bc2e3b3ffda5055e8724b9e0f/diff/usr/lib/.build-id/aa
 6 /var/lib/docker/volumes/aa
 7 /usr/share/locale/aa
 8 [root@host-yht yht]# cd /var/lib/docker/volumes/aa
 9 [root@host-yht aa]# ls
10 _data
11 [root@host-yht aa]# cd _data
12 [root@host-yht _data]# ls -a
13 .           colrm                               df              g13                   gzexe           lesspipe.sh         namei          pyvenv-3.6    sha224hmac            systemd-firstboot               ul                  xmlcatalog
14 ..          column                              dir             gapplication          gzip            link                newgidmap      ranlib        sha224sum             systemd-hwdb                    ulimit              xmllint
15 [           comm                                dircolors       gawk                  hash            linux32             newgrp         raw           sha256hmac            systemd-inhibit                 umask               xmlwf
16 addr2line   command                             dirmngr         gdbm_dump             head            linux64             newuidmap      read          sha256sum             systemd-machine-id-setup        umount              xz
17 alias       coredumpctl                         dirmngr-client  gdbm_load             hexdump         ln                  nice           readelf       sha384hmac            systemd-mount                   unalias             xzcat
18 ar          coreutils                           dirname         gdbmtool              hostid          locale              nisdomainname  readlink      sha384sum             systemd-notify                  uname               xzcmp
19 arch        cp                                  dmesg           gdbus                 hostname        localectl           nl             realpath      sha512hmac            systemd-path                    uname26             xzdec
20 as          cpio                                dnf             gencat                hostnamectl     localedef           nm             rename        sha512sum             systemd-resolve                 unexpand            xzdiff
21 awk         csplit                              dnf-3           getconf               i386            logger              nohup          renice        shred                 systemd-run                     uniq                xzegrep
22 b2sum       curl                                dnsdomainname   getent                iconv           login               nproc          resolvectl    shuf                  systemd-socket-activate         unlink              xzfgrep
23 base32      cut                                 domainname      getfacl               id              loginctl            nsenter        rev           size                  systemd-stdio-bridge            unshare             xzgrep
24 base64      date                                dracut          getopt                info            logname             numfmt         rm            skill                 systemd-sysusers                unversioned-python  xzless
25 basename    db_archive                          du              getopts               install         look                objcopy        rmdir         slabtop               systemd-tmpfiles                unxz                xzmore
26 bash        db_checkpoint                       dwp             gio                   ionice          ls                  objdump        rpm           sleep                 systemd-tty-ask-password-agent  update-ca-trust     yes
27 bashbug     db_deadlock                         echo            gio-querymodules-64   ipcalc          lsblk               od             rpm2archive   snice                 systemd-umount                  uptime              ypdomainname
28 bashbug-64  db_dump                             egrep           glib-compile-schemas  ipcmk           lscpu               p11-kit        rpm2cpio      sort                  tac                             users               yum
29 bg          db_dump185                          eject           gpasswd               ipcrm           lsinitrd            paste          rpmdb         sotruss               tail                            utmpdump            zcat
30 bootctl     db_hotbackup                        elfedit         gpg                   ipcs            lsipc               pathchk        rpmkeys       split                 tar                             uuidgen             zcmp
31 busctl      db_load                             env             gpg2                  isosize         lslocks             pgrep          rpmquery      sprof                 taskset                         uuidparse           zdiff
32 cal         db_log_verify                       evmctl          gpg-agent             jobs            lslogins            pidof          rpmverify     stat                  tee                             vdir                zegrep
33 ca-legacy   db_printlog                         ex              gpgconf               join            lsmem               ping           runcon        stdbuf                test                            vi                  zfgrep
34 cat         db_recover                          expand          gpg-connect-agent     journalctl      lsns                pinky          rvi           strings               timedatectl                     view                zforce
35 catchsegv   db_replicate                        expr            gpg-error             kdumpctl        makedb              pkill          rview         strip                 timeout                         vmstat              zgrep
36 cd          db_stat                             factor          gpgme-json            kernel-install  mcookie             pldd           script        stty                  tload                           w                   zless
37 c++filt     db_tuner                            fallocate       gpgparsemail          kill            md5sum              pmap           scriptreplay  su                    top                             wait                zmore
38 chacl       db_upgrade                          false           gpgsplit              kmod            mesg                pr             sed           sum                   touch                           wall                znew
39 chage       dbus-cleanup-sockets                fc              gpgv                  last            mkdir               printenv       seq           sync                  tr                              watch
40 chcon       dbus-daemon                         fg              gpgv2                 lastb           mkfifo              printf         setarch       systemctl             tracepath                       watchgnupg
41 chgrp       dbus-monitor                        fgrep           gpg-wks-server        lastlog         mkinitrd            prlimit        setfacl       systemd-analyze       true                            wc
42 chmem       dbus-run-session                    fincore         gpg-zip               ld              mknod               ps             setpriv       systemd-ask-password  truncate                        wdctl
43 chmod       dbus-send                           find            gprof                 ld.bfd          mktemp              ptx            setsid        systemd-cat           trust                           whereis
44 chown       dbus-test-tool                      findmnt         grep                  ldd             modulemd-validator  pwd            setterm       systemd-cgls          tsort                           who
45 chrt        dbus-update-activation-environment  flock           groups                ld.gold         more                pwdx           sg            systemd-cgtop         tty                             whoami
46 cksum       dbus-uuidgen                        fmt             gsettings             less            mount               pwmake         sh            systemd-delta         type                            write
47 col         db_verify                           fold            gtar                  lessecho        mountpoint          pwscore        sha1hmac      systemd-detect-virt   tzselect                        x86_64
48 colcrt      dd                                  free            gunzip                lesskey         mv                  pydoc3.6       sha1sum       systemd-escape        udevadm                         xargs

自动的将容器中/bin目录下所有的文件都拷贝到宿主机的aa目录下

12.3 查看数据卷

docker volume ls

12.4 查看某个数据卷的细节

docker volume inspect 卷名

12.5 创建数据卷

docker volume create 卷名

12.6 删除没有使用的数据卷

docker volume prune

 删除指定的数据卷:

docker volume rm 卷名

 

 

三.、docker中容器之间网络配置

1. docker容器与宿主机操作系统通信机制

https://www.bilibili.com/video/BV1ZT4y1K75K?p=12

 

2. docker 网络使用 

注意:一般在使用docker网桥(bridge)实现容器与容器通信时,都是站在一个应用角度进行容器进行通信

2.1 查看docker网桥配置

1 docker network ls

 

2.2 创建自定义网桥

1 docker network create [网桥名称]
1 [root@host-yht _data]# docker network create test
2 9e286d33856cb44b47df13b67f7fcb89417c0bffe4ff920757413206564b4689
3 [root@host-yht _data]# docker network ls
4 NETWORK ID     NAME      DRIVER    SCOPE
5 f789455f60ca   bridge    bridge    local
6 90b971a1079a   host      host      local
7 34aebc6940b3   none      null      local
8 9e286d33856c   test      bridge    local

 

2.3 启动容器的时候指定网桥

1 docker run  --network [网桥名称] [容器名] 
 1 [root@host-yht _data]# docker run -it --network test --name centosNet centos /bin/bash
 2 // 查看该容器细节
 3 [root@host-yht _data]# docker inspect centosNet
 4 .
 5 .
 6 .
 7 .
 8 .
 9 "Networks": {
10                 "test": {
11                     "IPAMConfig": null,
12                     "Links": null,
13                     "Aliases": [
14                         "7ca35c70ab61"
15                     ],
16                     "NetworkID": "9e286d33856cb44b47df13b67f7fcb89417c0bffe4ff920757413206564b4689",
17                     "EndpointID": "afe9e788182575bf5b6d36b0a213efc251d8a65d1771f4893dfebd3d121a5f8f",
18                     "Gateway": "172.18.0.1",
19                     "IPAddress": "172.18.0.2",
20                     "IPPrefixLen": 16,
21                     "IPv6Gateway": "",
22                     "GlobalIPv6Address": "",
23                     "GlobalIPv6PrefixLen": 0,
24                     "MacAddress": "02:42:ac:12:00:02",
25                     "DriverOpts": null

 

注意:1、指定网桥后就只能与在这个网桥上的服务连接,且不能连接到默认网桥了

           2、一旦在启动容器时制定了网桥,日后可以在任何这个网桥关联的容器中使用容器名字进行与其他容器进行通信(名字==ip)

2.4 删除网桥

docker network rm 网桥名称

 

2.5 查看网桥详细信息

docker inspect 网桥名称

 

 

 

 

四、Docker安装mysql

MySQL官方文档:https://hub.docker.com/_/mysql?tab=description&page=1&ordering=last_updated&name=5.7

1. 拉取镜像

(我这儿使用的是版本mysql:5.7.35)

1 docker pull mysql:5.7.35

 

2. 启动镜像

2.1 基本启动mysql服务

1 docker run -e MYSQL_ROOT_PASSWORD=root mysql:5.7.35
 1 
 2 // 必需参数
 3 // -e MYSQL_ROOT_PASSWORD=root 代表给root用户指定密码
 4 [root@host-yht yht]# docker run -e MYSQL_ROOT_PASSWORD=root mysql:5.7.35
 5 2021-09-29 05:29:33+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.35-1debian10 started.
 6 2021-09-29 05:29:33+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
 7 2021-09-29 05:29:33+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.35-1debian10 started.
 8 2021-09-29 05:29:33+00:00 [Note] [Entrypoint]: Initializing database files
 9 .
10 .
11 .
12 .
13 .
14 2021-09-29T05:29:41.651967Z 0 [Note] mysqld: ready for connections.
15 Version: '5.7.35'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
1 [root@host-yht ~]# docker ps 
2 CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                 NAMES
3 3a711cb06320   mysql:5.7.35   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   3306/tcp, 33060/tcp   blissful_nobel

 

2.2 启动一个mysql服务01

(要有后台运行,指定root用户密码,指定容器名字,指定端口号)

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7.35
1 [root@host-yht ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 --name mysql01 mysql:5.7.35
2 320b1f2b183b4ea5a04b86228e4211401da8d66ce1be715c84cd685b9663ec29
3 [root@host-yht ~]# docker ps
4 CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS         PORTS                                                  NAMES
5 320b1f2b183b   mysql:5.7.35   "docker-entrypoint.s…"   10 seconds ago   Up 8 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql01

 

打开你的Navicat,然后去连接测试该mysql服务

主机:是你宿主机的任意ip地址

端口号:你要是没有指定,一般默认就是3306

用户名:root

密码:你启动容器的时候指定的密码

然后左下角测试连接

 

 

 

 2.3 启动一个mysql服务02

(指定root用户密码,指定容器名字,使用数据卷将数据持久化到宿主机系统,指定名字)

注意:通过dockerhub官方文档我们得知这个mysql服务的存储数据文件目录放置在容器这个目录中:  /var/lib/mysql

挂在后的好处就是,你以后将容器中的数据删除,不必担心数据是否消失,然后还可以将数据继承给你下一个创建的容器

1 docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=111 --name mysql02 -v mysqldata:/var/lib/mysql mysql:5.7.35
 1 [root@host-yht ~]# docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=111 --name mysql02 -v mysqldata:/var/lib/mysql mysql:5.7.35
 2 46dcfe143e8a8be75c1748b63417825c49804c37ab6c65b76057f27585522f72
 3 [root@host-yht ~]# docker ps
 4 CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
 5 46dcfe143e8a   mysql:5.7.35   "docker-entrypoint.s…"   7 seconds ago   Up 5 seconds   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   mysql02
 6 // 查看所有数据卷
 7 [root@host-yht ~]# docker volume ls
 8 DRIVER    VOLUME NAME
 9 local     268e10216877a5a586a2e5fbb9580887a69d77f2eb08b8abe6613615aeb0cb38
10 local     f6cd81607ffb817615d8ca4ca8bf60842f80bb6b271e4910cc8e1de29e003126
11 local     mysqldata
12 // 查看指定数据卷的详细信息
13 [root@host-yht ~]# docker volume inspect mysqldata
14 [
15     {
16         "CreatedAt": "2021-09-29T14:03:21+08:00",
17         "Driver": "local",
18         "Labels": null,
19         "Mountpoint": "/var/lib/docker/volumes/mysqldata/_data",
20         "Name": "mysqldata",
21         "Options": null,
22         "Scope": "local"
23     }
24 ]
25 // 进入数据卷目录
26 [root@host-yht ~]# cd /var/lib/docker/volumes/mysqldata/_data
27 [root@host-yht _data]# ls
28 auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
29 ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem

 2.4 启动一个mysql服务03

(后台运行,指定root用户密码, 指定用户名,使用数据卷进行数据持久化,以已修改之后的配置文件启动)

 1 [root@host-yht ~]# docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=111 --name mysql03 -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql mysql:5.7.35
 2 19f5bfdbfbd1c9550479924618ef6d47397ac1a955278c5db0a434577ed30415
 3 [root@host-yht ~]# docker volume ls
 4 DRIVER    VOLUME NAME
 5 local     268e10216877a5a586a2e5fbb9580887a69d77f2eb08b8abe6613615aeb0cb38
 6 local     f6cd81607ffb817615d8ca4ca8bf60842f80bb6b271e4910cc8e1de29e003126
 7 local     mysqlconfig
 8 local     mysqldata
 9 [root@host-yht ~]# docker volume inspect mysqlconfig
10 [
11     {
12         "CreatedAt": "2021-09-29T16:45:39+08:00",
13         "Driver": "local",
14         "Labels": null,
15         "Mountpoint": "/var/lib/docker/volumes/mysqlconfig/_data",
16         "Name": "mysqlconfig",
17         "Options": null,
18         "Scope": "local"
19     }
20 ]
21 [root@host-yht ~]# cd /var/lib/docker/volumes/mysqlconfig/_data
22 [root@host-yht _data]# ls
23 conf.d  my.cnf  my.cnf.fallback  mysql.cnf  mysql.conf.d

 

注意:不能两个正在运行的容器同时映射同一个目录,不然你启动服务的时候会报错!!!

 

posted @ 2021-09-13 11:36  墨mo水  阅读(371)  评论(0)    收藏  举报