常用Docker命令

举报
yd_221104950 发表于 2020/12/03 00:15:17 2020/12/03
【摘要】 Docker命令分为管理命令、镜像命令、容器命令、仓库命令、网络命令、数据卷命令、编排命令。 1、启动Docker ~$ sudo service docker start 1 2、确认Docker运行状态 ~$ sudo docker run --rm hello-world 1 Hello from Docker! //出此句说话,即正常 3、重启Doc...

Docker命令分为管理命令、镜像命令、容器命令、仓库命令、网络命令、数据卷命令、编排命令。

1、启动Docker

~$ sudo service docker start

  
 
  • 1

2、确认Docker运行状态

~$ sudo docker run --rm hello-world

  
 
  • 1

Hello from Docker! //出此句说话,即正常

3、重启Docker

~$ sudo service docker restart

  
 
  • 1

4、搜索docker镜像 ,如搜索ubuntu相关的镜像

~$ sudo docker search ubuntu

  
 
  • 1

5、从指定仓库拉取docker镜像到本地,格式:docker pull containerName:tag,不指定tag,默认last,拉取的镜像放在/var/lib/docker/

 ~$ sudo docker pull nginx
	Using default tag: latest
	latest: Pulling from library/nginx
	6ae821421a7d: Pulling fs layer 
	da4474e5966c: Pulling fs layer 
	eb2aec2b9c9f: Download complete /var/lib/docker$ sudo ls /var/lib/docker builder   containers  network	plugins   swarm  trust buildkit  image overlay2	runtimes  tmp	 volumes

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

6、将docker镜像推送到仓库,不指定tag,默认是last

~$ sudo docker push name[:tag] 
~$ sudo ls -l /var/lib/docker
total 48
drwx------  2 root root 4096 11月 14 15:02 builder
drwx------  4 root root 4096 11月 14 15:02 buildkit
drwx------  3 root root 4096 11月 15 16:09 containers  //存放容器的信息
drwx------  3 root root 4096 11月 14 15:02 image  //存放镜像的信息
drwxr-x---  3 root root 4096 11月 14 15:02 network  //存放网络的信息
drwx------ 15 root root 4096 11月 15 16:58 overlay2
drwx------  4 root root 4096 11月 14 15:02 plugins
drwx------  2 root root 4096 11月 14 15:22 runtimes
drwx------  2 root root 4096 11月 14 15:02 swarm   //存放集群的信息
drwx------  2 root root 4096 11月 15 15:04 tmp
drwx------  2 root root 4096 11月 14 15:02 trust
drwx------  2 root root 4096 11月 14 15:02 volumes  //存放数据卷的信息

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

7、查看Docker本地镜像

~$ sudo docker images 

  
 
  • 1

8、构建镜像
(1)通过Docker Hub自动构建
(2)用build命令构建:
首先,在当前目录下创建Dockerfile文件
然后执行下面的命令:

~$ sudo docker build -t myubuntu:me . //别忘了最后的那个点,表示当前目录。

~$ sudo docker images //查看

  
 
  • 1
  • 2
  • 3

在当前目录建立一个名为Dockerfile的文件,然后指定一个基础镜像:

from ubuntu
Run echo

  
 
  • 1
  • 2

镜像定制就是在一个基础镜像上不断堆叠其他部分。

9、导出Docker镜像

~$ sudo docker save -o myu.tar  myubuntu:me
~$ ls
myu.tar

  
 
  • 1
  • 2
  • 3

10、导入由save命令导出 的Docker镜像

~$ sudo docker load -i myu.tar

  
 
  • 1

11、docker rmi命令能确保没有容器使用的情况下,删除docker镜像

~$ sudo docker rmi myubuntu:me

  
 
  • 1

12、docker create命令创建容器,此时仅仅创建了容器但并未启动,可用docker start命令启动容器。docker create命令常用于在启动容器之前进行必要的设置,如设置容器另名、指定数据卷、指定端口映射、设置ip等,后续会一一提到,在此先给出个简单的例子:

~$ sudo docker create -it --name myU myubuntu:me bash

  
 
  • 1

13、启动docker容器,容器必须先用docker create命令创建出来

~$ sudo docker start -a -i myU //容器的别名或id

  
 
  • 1

13、重启docker容器

~$ sudo docker restart  myU

  
 
  • 1

14、查看本地docker容器信息

~$ sudo docker ps -a

  
 
  • 1

15、查看docker容器状态

~$ sudo docker stats myU

  
 
  • 1

16、删除docker容器,注意docker rmi是删除镜像

~$ sudo docker rm myub

  
 
  • 1

17、停止Docker容器进程,正常停止可以保证数据不会丢失

~$ sudo docker stop myU 

  
 
  • 1

18、杀掉Docker容器进程,此举属于非正常停止容器,数据可能会丢失

~$ sudo docker kill myU

  
 
  • 1

19、[不推荐]创建并启动docker容器,有些机器上,此命令可能会没有效。

~$ sudo docker run -it –name  myUU myubuntu:me bash  //容器名为myUU  镜像为 myubuntu:me

  
 
  • 1

20、进入容器的方式,大概有ssh登录、nsenter或nsinit第三方工具、Docker工具等

~$ sudo docker attach myU
或
~$ sudo docker exec -it myU bash //推荐

  
 
  • 1
  • 2
  • 3

21、暂停docker容器

~$ sudo docker pause myU

  
 
  • 1

22、恢复puase暂停的docker容器

~$ sudo docker unpause myU

  
 
  • 1

23、docker容器与宿主机之间的文件复制(所谓宿主机,就是安装了docker的主机)
(1)从docker容器复制文件到宿主机:
docker cp :<container_path> <host_path>

~$ sudo docker cp myU:/home/home.txt /home/wong/Dektop

  
 
  • 1

(2)从宿主机复制文件到docker容器:
docker cp <host_path> :<container_path>

~$docker cp /home/wong/Dektop/haha.txt  <containerID>:/home/wong/file_folder 

  
 
  • 1

24、查看容器的变化

~$ sudo docker diff myU

  
 
  • 1

25、提交当前容器并打包为镜像 。容器内的文件和宿主机是隔离开的,如果不使用docker commit提交容器作为镜像数据保存下来的话,数据就会因为容器的删除而丢失。这样不利于迁移和重新构建等情况。

~$ sudo docker  commit myU

  
 
  • 1

25、导出本地Docker容器,tar包镜像包

~$ sudo docker export -o myUbuntu.tar myU
或
~$ sudo docker export myU >  myUbuntu.tar

  
 
  • 1
  • 2
  • 3

26、导入export导出的Docker镜像

~$docker import https://example.com/container.tar  //导入存放在网络上的镜像
~$sudo docker import myUbuntu.tar  //导入本地包

  
 
  • 1
  • 2

27、查看Docker服务端的事件
//容器相关的attach、commit、copy、create、destroy、detach、die、exec_create、exec_detach、exec_start、export、kill、oom、pause、rename、resize、restart、start、stop、top、unpause、update

~$ sudo docker events -f container=<name or id>  

  
 
  • 1

//镜像相关的delete、import、load、pull、push、save、tag、untag

~$ sudo docker events -f image=<tag or id> 

  
 
  • 1

//create、mount、unmount、destroy

~$ sudo docker events -f network=<name or id> 

  
 
  • 1

//create、connect、disconnect、destroy

~$ sudo docker events -f daemon=<name or id> 

  
 
  • 1

//delete、import、load、pull、push、save、tag、untag

~$ sudo docker events -f volume=<name or id> 

  
 
  • 1

28、查看Docker镜像历史

~$ sudo docker history ubuntu

  
 
  • 1

29、查看Docker信息

~$docker info

  
 
  • 1

30、查看详细信息

~$docker inspect  CONTAINER|IMAGE|TASK

  
 
  • 1

31、查看docker容器日志

~$ sudo docker logs myU

  
 
  • 1

32、重命名docker镜像

~$ sudo docker rename myU_old MyL_new

  
 
  • 1

33、查看容器进程

~$ sudo docker top myU

  
 
  • 1

34、设置镜像标签 :Docker中的镜像、容器、网络、数据卷等 组件在运行时,都会自动获取一个ID,ID是唯一的,但ID不好记,可以打上标签,那么通过标签来找就方便多了。

~$sudo docker tag afb9ac76685c mylove:2018

  
 
  • 1

35、查看docker版本

~$ sudo docker version

  
 
  • 1

36、设置容器等待,一般用于容器的监控、异常捕捉方面

~$ sudo docker wait container

  
 
  • 1

37、对容器做的设置进行更新,命令格式:
docker update [OPTIONS] CONTAINER [CONTAINER…]

–blkio-weight
0
阻塞IO(相对权重),介于10和1000之间,或0禁用(默认为0)
–cpu-period
0
限制CPU CFS(完全公平的调度程序)周期
–cpu-quota
0
限制CPU CFS(完全公平的调度程序)配额
–cpu-rt-period
0
限制CPU实时周期(以微秒为单位)
–cpu-rt-runtime
0
以微秒为单位限制CPU实时运行时间
–cpu-shares, -c
0
CPU份额(相对权重)
–cpuset-cpus

允许执行的CPU(0-3,0)
–cpuset-mems

允许执行的内存率(0-3,0.1)
–kernel-memory

内核内存限制
–memory, -m

内存限制
–memory-reservation

内存软限制
–memory-swap

交换限制等于内存加交换:’-1‘以启用无限制的交换
–restart

更新容器应用的策略

~$ sudo docker update -m 500m --memory-swap -1 myU

  
 
  • 1

设置了之后 可以通过$sudo docker stats myU查看

38、管理数据卷的docker volume命令

Docker的卷有两种:数据卷、数据卷容器

数据卷:数据卷就是一个目录,它是由Docker daemon挂载到容器中的,因此数据卷并不属于联合文件系统。Docker使用的是AUFS联合文件系统。两个容器使用同一个数据卷,就是数据卷共享。
数据卷容器:专门用来存放数据的数据卷容器。它不需要运行任何应用,只是一个存放数据的容器,允许其他容器挂载就可以了。注意:不要运行数据卷容器,因为这纯粹是一种浪费资源,只要数据卷容器存在,数据卷就不会消失,不管容器处于什么状态。

(1)挂载数据卷
在使用docker run或docker create命令时,指定-v参数来添加数据卷,如:
第一步,创建容器,并指定数据卷:

~$ sudo docker create -it --name mVVV -v /hostVol:/ContainerV myv:2018 bash

  
 
  • 1

注:-v /hostVol:/ContainerV:rw 表示可读可写 -v /hostVol:/ContainerV:ro只读
第二步,启动容器

~$ sudo docker start -a -i mVVV

  
 
  • 1

第三步,测试:

root@974478e5a35c:/# cd ContainerV
root@974478e5a35c:/ContainerV# touch hahah.txt
root@974478e5a35c:/ContainerV# echo "safdsafdsafasfdasfddsaf" > hahah.txt

  
 
  • 1
  • 2
  • 3

第四步,测试结果显示在宿主机目录/hostVol下有名为hahah.txt的文件,内容为 safdsafdsafasfdasfddsaf。测试成功。

第五步:用docker inspect查看数据卷的详细信息

~$sudo docker inspect mVVV
 "Mounts": [ { "Type": "bind", "Source": "/hostVol", "Destination": "/ContainerV", "Mode": "", "RW": true, "Propagation": "rprivate" } ... ]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如果没有指定在宿主机的目录,则使用默认的目录,如:

~$ sudo docker create -it --name mVVV -v /ContainerV myv:2018 bash
~$sudo docker inspect mVVV

"Mounts": [ { "Type": "volume", "Name": "2d49f45311e30297186819f8507b9944f76337abe971351a4510f6e319a5a41e", "Source": "/var/lib/docker/volumes/2d49f45311e30297186819f8507b9944f76337abe971351a4510f6e319a5a41e/_data", "Destination": "/ContainerV", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ... ]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

可以看到在宿主机的目录是:/var/lib/docker/volumes/2d49f45311e30297186819f8507b9944f76337abe971351a4510f6e319a5a41e/_data,我想你也不想去记一个这么长的目录吧,所以最好指定一个宿主机目录。

将宿主机上的目录(对容器来说就是数据卷)挂载到容器上,不仅仅可以保存数据卷内容,还可以把程序代码目录挂载到容器上,在容器里面编译,编译成功直接在宿主机下就可以找到编译好的项目,保证宿主机的清洁与稳定。

(2)挂载数据卷容器

虽然挂载本地目录到容器解决了数据持久化的问题,但是迁移上还是很麻烦,比如多个容器之间共享数据需要迁移时,使用挂载宿主机的文件夹的方法迁移起来就会很麻烦。所以为了管理数据卷,可以启动一个容器专门用来存放数据。

第一步,创建数据卷容器

~$ sudo docker  create -it -v /HostVol:/ContainerVol --name=My_Volume ubuntu bash

  
 
  • 1

第二步,启动其他容器,并挂载数据卷容器

~$ sudo docker  create -it --volumes-from=My_Volume --name=db1 ubuntu bash

  
 
  • 1

甚至还可以通过容器db1来挂载到后续启动的容器中:

~$ sudo docker  create -it --volumes-from=db1 --name=db2 ubuntu bash

  
 
  • 1

第三步测试:挂载了数据卷容器的容器都有/ContainerVol这个目录,把上面这些容器全部删除掉,数据卷也不会消失,因为数据卷保存在了宿主机/HostVol目录下。如果没有数据卷容器映射到宿主机的某个指定目录,则数据卷在宿主机上的/var/lib/docker/volumes/的某个目录下,即使用默认目录,可通过docker inspect 查看详细信息。

~$ sudo docker start -a -i db2
root@0ae704541d7c:/# ls
ContainerVol  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@0ae704541d7c:/# cd ContainerVol
root@0ae704541d7c:/ContainerVol# touch haha.txt
root@0ae704541d7c:/ContainerVol# echo "adfasdfsadf" > haha.txt

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

第四步,测试结果显示在宿主机目录/HostVol 下有名为haha.txt的文件,内容为 adfasdfsadf。测试成功。

显示所有没有挂载到容器上的数据卷:

//删除容器时没有使用-v标志,这些数据卷就会成为dangling状态。
~$sudo docker volume ls f dangling=true //删除这些dangling状态的数据卷
~$sudo docker volume rm <volume name>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

39、备份数据卷

第一步:先创建一个临时容器,再挂载数据卷/host_backup目录到临时容器/tmp_container_backup目录,再挂载要备份的数据卷容器(要备份的目录是/ContainerVol)。

~$ sudo docker create -it -v /host_backup:/tmp_container_backup  --volumes-from=My_Volume --name tmpBackupContainer ubuntu bash

  
 
  • 1

第二步:启动临时容器

~$ sudo docker start -a -i tmpBackupContainer

  
 
  • 1

第三步:在临时容器中执行备份,如压缩数据卷容器中(/ContainerVol)的文件,然后放到/tmp_container_backup目录下,这样宿主机/host_backup目录下存在了相同的文件,这样就完成了备份。如:

root@59269ee13d6a:/# ls
ContainerVol  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  tmp_container_backup  usr  var
root@59269ee13d6a:/# cd ContainerVol
root@59269ee13d6a:/ContainerVol# ls
haha.txt
root@59269ee13d6a:/ContainerVol# tar -cvjpf haha.tar.bz2 haha.txt
haha.txt
root@59269ee13d6a:/ContainerVol# ls
haha.tar.bz2  haha.txt
root@59269ee13d6a:/ContainerVol# mv haha.tar.bz2 ../tmp_container_backup

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

宿主机/host_backup目录下存在了haha.tar.bz2

40、迁移、恢复数据卷
第一步:创建一个数据卷容器,数据卷目录名要与备份的一样:

~$ sudo docker create -it -v /ContainerVol --name db_data2 ubuntu bash

  
 
  • 1

第二步:创建一个临时容器 tmpContainer

~$ sudo docker create -it --name tmpContainer --volumes-from db_data2 -v /host_backup:/tmp_container_backup ubuntu

  
 
  • 1

第三步:启动临时容器,在容器中解压文件,再将文件移动到新的数据卷容器的/ContainerVol 目录下就完成了数据的迁移及恢复。

~$ sudo docker start -a -i tmpContainer
root@b8c7d1e13f5f:/# ls
ContainerVol  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  tmp_container_backup  usr  var
root@b8c7d1e13f5f:/# cd tmp_container_backup
root@b8c7d1e13f5f:/tmp_container_backup# tar -xvjf haha.tar.bz2
haha.txt
root@b8c7d1e13f5f:/tmp_container_backup# mv haha.txt ../ContainerVol

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第四步:测试,启动新的数据卷容器,看文件是否恢复成功。

~$ sudo docker start -a -i db_data2
root@73fe55200f52:/# ls
ContainerVol  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@73fe55200f52:/# cd ContainerVol
root@73fe55200f52:/ContainerVol# ls
haha.txt  //在新的数据卷容器有恢复的内容
root@73fe55200f52:/ContainerVol# 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

小结:Docker的volume本质上是一个目录,它是一个挂载点,在容器创建时,这个挂载点会被挂载到一个宿主机的目录,这个目录可以是以volume ID为名的文件夹,也可以是启动参数中指定的目录。挂载之后容器与宿主机显示的目录会表现为同一个目录,独立于容器的rootfs 。

Docker传统的卷管理只能挂载本机目录到容器中,数据的备份、同步、迁移都是个挑战,可以通过第三方插件来解决,如Convoy和Flocker插件。

41、管理网络命令
Docker目前对单节点的设备提供了映射容器端口到宿主机、容器互联两个网络服务。

端口映射:在Docker中容器默认是无法与外部通信的,需要在启动命令中加入对应参数才允许容器与外界通信
当容器运行着一个Web服务时,需要把容器内的web服务应用程序端口映射到本地宿主机的端口,这样用户通过访问宿主机指定端口时,相当于访问容器内部的web服务端口,映射方式:
(1)端口映射方式1:-p Local_Port:Container_Port ,这种方式可以让访客通过访问宿主机的端口来访问容器服务,一般情况下,都用这种方式。
(2)端口映射方式2:-p Local_IP:Local_Port:Container_Port ,这种方式可以映射到指定地址的指定端口。例如映射到127.0.0.1这个地址:-p 127.0.0.1:8000:80,那么这个端口只能通过本机访问,外部无法访问这个容器服务,一般在测试环境下会用到。同样地,如果指定了一个子网IP,那么只有在同一个子网内的用户才可以访问,局域网外的用户无法访问。
(3)端口映射方式3:-p Local_IP::Container_Port ,这种方式有点像方式2,就是指定了哪些IP可以访问,但是宿主机端口却是随机分配映射的。
(4)端口映射方式4:指定传输协议,以上三种格式还可以使用tcp或者udp标记来指定端口,如:
方式1:-p Local_Port:Container_Port /tcp
方式2:-p Local_IP:Local_Port:Container_Port /udp
方式3:-p Local_IP::Container_Port /tcp

42、容器互联
端口映射的用途是宿主机与容器的通信,而容器互联是容器之间的通信。容器互联除了端口映射外,还可以通过容器别名互联。使用容器别名互联时,容器必须要有一个名字,也就–name指定的值。这个值不管理用户是否定义了,都会存在,默认由Docker随机生成词组。但一般为了方便操作与记忆都会手动设置容器名称。如果忘记了设置名称,可以通过docker rename来重命名容器。容器的名称是唯一了,如果名称已存在,新的同名容器会无法创建。容器互联的参数–link,步骤如下:

第一步,创建一个数据库容器:

~$ sudo docker create -it --name db -e MYSQL_ROOT_PASSWORD=password mysql:5.6

  
 
  • 1

注:-e MYSQL_ROOT_PASSWORD=password设置数据库root密码
第二步,启动数据库容器:

~$ sudo docker start -a -i db

  
 
  • 1

第三步,创建一个web服务:

~$ sudo docker create -it -p 8000:80 --name myPhpWeb --link db:myphp richarvey/nginx-php-fpm bash

  
 
  • 1

这里–link db:myphp使用参数值左右不同的写法来区分,左边表示的是刚才启动的容器名称,代表MySQL容器,右边myphp表示后来运行的PHP容器。

第四步,启动PHP容器

~$ sudo docker start -a -i myPhpWeb

  
 
  • 1

第五步,测试PHP容器与数据库容器是否互联成功。在PHP容器启动完成后,使用ping db查看是否连接成功:

bash-4.4# ping db
PING db (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.113 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.166 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.170 ms
64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.122 ms
64 bytes from 172.17.0.2: seq=4 ttl=64 time=0.171 ms
64 bytes from 172.17.0.2: seq=5 ttl=64 time=0.163 ms
64 bytes from 172.17.0.2: seq=6 ttl=64 time=0.147 ms
^C
--- db ping statistics ---
7 packets transmitted, 7 packets received, 0% packet loss
round-trip min/avg/max = 0.113/0.150/0.171 ms

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

ping通了,表明容器互联成功了。注:ping <容器名>

也可以建立一个PHP文件,测试是否能连接 MySQL容器。

<?php
	$con = mysql_connect(“mysql”,”root”,”password”);
if(!$con){
	die(‘Could not connect :’.mysql_error());
}
?>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意mysql_connect(“mysql”,”root”,”password”);之中没有使用localhost来连接,这是因为在容器中的/etc/hosts文件会实时根据环境而改变,例如使用—link连接容器的时候,就会在容器的/etc/hosts文件中添加一行内容:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 mysql 00467a2d7da1 db
172.17.0.3 7efd4da74342

–link只能在容器之间使用。使用–link参数创建的容器会使用容器的主机名和容器ID来更新自己的/etc/hosts文件。使用–link参数时不会向宿主机映射端口,而是在容器之间建立一个通信隧道,因此避免了把数据库端口暴露到外部网络中。
值得注意的是,使用–link时不只是允许容器之间通信,还包括环境变量的设置,如:
root@7efd4da74342:/# env

MYSQL_ENV_MYSQL_ROOT_PASSWORD=password
MYSQL_PORT_3306_TCP_PROTO=tcp
HOSTNAME=7efd4da74342
MYSQL_NAME=/PHPWEB/mysql
MYSQL_ENV_MYSQL_MAJOR=5.6
MYSQL_PORT=tcp://172.17.0.2:3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306
PWD=/
MYSQL_ENV_MYSQL_VERSION=5.6.42-1debian9
HOME=/root
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MYSQL_ENV_GOSU_VERSION=1.7
_=/usr/bin/env
root@7efd4da74342:/#

从上述结果可以看出,使用env输出的内容实际上都是db容器的环境变量,通过–link使得环境变量也交换了,这样做有助于迅速与数据库建立连接,如果PHP容器之前设置了env,那么将会被后来的db容器的env覆盖。–link参数可以使用多次,即PHP容器允许连接多个数据库。

43、端口暴露
端口暴露与端口映射是两个不同的概念。可以用EXPOSE指令在Dockerfile里定义或用—expose参数来指定,如–expose=1324

44、Docker网络模式

(1)bridge模式是Docker默认的网络模式,属于一种NAT网络模型,Docker daemon在启动的时候就会建立一个docker0网桥,每个容器使用bridge模式启动时,Docker都会为容器创建一对虚拟网络接口设备。这对设备一端在容器的Network Namespace,另一端在docker0。这样就实现了容器与宿主机的通信。
(2)none模式:不为容器配置任何网络,使用容器完全失去网络功能,启用这种模式,添加–net=none即可。
(3)container模式:表不与另一个运行中的容器共享一个Network Namespace, --net=container:<另一个容器名>。查看两个容器的/etc/hosts会发现它们都拥有同一个hostname。
(4)host模式:不推荐,与主机共享Root Network Namespace,容器有完整的权限操纵主机的网络配置。 
(5)overlay模式:是Docker原生的跨主机多子网网络模型,当创建一个新的网络时,Docker会在主机创建一个Network Namespace,Network Namespace内有一个网桥,网桥上有一个vxlan接口,每个网络占用一个vxlan ID,当容器被添加到网络中时,Docker会分配一对veth网卡设置,与bridge模式一样,一端在容器的Network Namespace,另一端在主机的Network Namespace上。
docker network connect <网络名> <容器名>//将指定容器连接到指定网络
如:

~$ sudo docker network connect foo PHPWEB

  
 
  • 1

用docker network create <网络名>创建一个网络。默认情况下,新建网络默认使用桥接模式,如果想要新建其他模式的网络可以使用-d参数来指定。如:

~$ sudo docker network create foo
99a4382fbaf78288694fd408ccaa8d01e4ba7a6428a963cf8b0bd67e9b51cc50
~$ sudo docker network diconnect <网络名>  <容器名>//断开指定容器的网络
如:~$ sudo docker network disconnect foo PHPWEB
~$ sudo docker network inspect <网络名>//显示指定容器的网络信息
如:~$ sudo docker network inspect foo
~$ sudo docker network ls //显示所有docker的网络
如:~$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
4a1b46aff078 bridge bridge local
99a4382fbaf7 foo bridge local
baf35b082a88 host host local
be8b94f86fbf none null local

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

用 docker network rm <网络名>删除指定网络,如:

~$ sudo docker network rm foo

  
 
  • 1

45、查看docker容器端口
docker port 只能查看运行中的容器的端口信息如:

~$ sudo docker port PHPWEB
[sudo] password for wong: 
80/tcp -> 0.0.0.0:8000

  
 
  • 1
  • 2
  • 3

46、docker daemon设置Docker启动时的网络参数(此命令运行在服务端)
-b,将容器附加到一个网桥上
–bip 指定docker0的IP,不能与-b一起用
–default-gateway指定容器默认的IPV4网关
–default-gateway-v6指定容器默认的IPV6网关
–dns=[]设置容器默认的DNS
–dns-opt=[]
–dns-search=[]
–icc=true设置是否允许容器间通信
–ip=0.0.0.0容器端口暴露时绑定的主机IP,一般默认即可。
–iptables=true设置是否允许向iptables添加规则

47、登录docker镜像仓库

$docker  login

  
 
  • 1

48、登出docker镜像仓库

$docker  logout

  
 
  • 1

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/87967719

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。