docker3 docker run 高阶参数

1、docker run -e参数:

   -e(向容器内传递环境变量,启动容器时用户可以动态传参)

1)--name  指定名称

2)-v  挂载文件,把该容器的数据保存到挂载的文件上(-v命令:的左边是docker外的地址或者端口,冒号右边是docker内的地址或者端口)

3)-p  端口映射 -p 8888:3306,8888宿主机的8888端口映射到容器的3306端口上 (-v命令:的左边是docker外的地址或者端口,冒号右边是docker内的地址或者端口)

4) -d  后台运行

5)-i  以交互模式运行容器,通常与 -t 同时使用

6)-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用

命令:

docker run --name some-mysql -v /home/navy/test/mysql:/var/lib/mysal -e MYSQL_ROOT_PASSWORD=1qaz9oI.  -p 8888:3306 -d mysql:5.7   (bridge模式,端口映射)

2、docker run --network参数:

docker的网络模式:bridge host ipvlan macvlan null overlay(ipvlan macvlan overlay这三个网络模式是集群用的很少用到)

(1)null模式:无网络模式,自已手动设置网络模式

(2)bridge模式:docker启动的默认模式,外界无法访问,有良好的网络隔离性,复杂性高,使用最多,是容器编排的基础;

网络原理:

1)linux名称空间的作用:虚拟化的强要求就是隔离,容器与容器、容器与宿主机之间要隔离这样是为了不互相干扰,但是目前内核没有隔离,除了内核外的网络、资源、文件系统、进程空间等都要隔离。

2)网络名称空间:有网络名称空间这个东西让虚拟机与虚拟机、虚拟机与宿主机之间是完全隔离,不能通信;那么他们怎么通信呢?虚拟网卡可以解决这个问题:虚拟网卡成对出现,如果一对中的一个网卡发送信息(报文)会无条件地发送给这一对中的另一个虚拟网卡(如下图1);但是这会产生一个问题:如果要两两通信的很多那得放很多虚拟网卡

docker3 docker run 高阶参数_第1张图片

3)为了解决2)中的问题引入了另一种技术:linux bridge(网桥):把成对网卡中的另一块放在网桥上,这样A要和C通信,A发出找Cip和端口的信息,B在网桥中的那一块网卡看到A的信息后发现不是自己就丢弃这个包,C在网桥中的那一块网卡看到A的信息发现就是自己的ip就会信息转发给C这个容器中的那块网卡里(如下图2)

docker3 docker run 高阶参数_第2张图片

4)网桥再和宿主机连接,连接到eth0上,这样所有容器可以与宿主机通信:A要与外网一个IP和端口通信,(外网与子网掩码相与,发现不是内网Ip,就不在网桥内广播了)网桥会把A的信息发到宿主机的网卡上(如下图3),需求ipv4_fordward

docker3 docker run 高阶参数_第3张图片docker3 docker run 高阶参数_第4张图片

 iptables:4表5链

外网访问容器:目的地址:Hostip:port-->contianerip:port       源地址:本机Ip:port-->宿主机Ip:port

(3)host模式:直接使用宿主机的网络,容易发生端口冲突(编译容器的时候用host模式/host模式可以当路由);如下图容器直接与宿主机通信

docker3 docker run 高阶参数_第5张图片

eg:        docker run --name myjenkins -itd --network host -v /home/hogwarts/tech/tech/images/jenkins_data:/var/jenkins_home --env JAVA_OPTS="-xMX8192m" jenkins/jenkins   (host网络模式启动

(4)container模式:内置网络模式,与以上几种物理层面的网络模式不同,同一个宿主机中不同容器互相通信

docker3 docker run 高阶参数_第6张图片

eg: 1)前端:docker run --name =conan  -itd  -p 8999:4200 conan (bridge模式启动)           docker run --name=holmes -itd  --network=container:conan holmes( container模式启动,并且指向前端bridge模式启动的容器,这样两个容器就能互相通信)

       2)前端:docker run --name =conan  -itd  -p 8999:4200 conan (bridge模式启动)          docker run --name=holmes -itd --net=host holmes( host网络模式启动)

注意:Linux命令中--代表全称,-代表简称,比如--name可以的简写-n

3、另外一种两个容器间接连接的方式(官方开源容器喜欢这种方式来让两个容器通信):--link

eg:搭建testlink:

1)启动mariadb:(docker的镜像文件中有说明,启动teslink之前需要先启动mariadb,mariadb是mysql旗下另一款数据库产品,语法特性和mysql是一样的)

docker run -d --name= mariadb -e ALLOW_EMPTY_PASSWORD=yes -e MARIADB_USER=bn_testlink -e MARIADB_DATABASE=bitnami_testlink -v /home/test/mysql:/var/lib/mysql -p 8088:3306 bitnami/mariadb:latest

2)启动testlink:(testlink暴露出两个端口所以做了两次端口映射):用--link的方式把mariadb的环境变量的信息注入到testlink的容器中了

docker run -d --name=testlink -p 8099:80 -p 444:443 -e ALLOW_EMPTY_PASSWORD=yes -e TESTLINK_DATABASE_USER=bn_testlink -e TESTLINK_DATABASE_NAME=bitnami_testlink --link mariadb bitnami/testlink:latest

你可能感兴趣的:(环境搭建配置管理,docker,网络,linux)