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);但是这会产生一个问题:如果要两两通信的很多那得放很多虚拟网卡
3)为了解决2)中的问题引入了另一种技术:linux bridge(网桥):把成对网卡中的另一块放在网桥上,这样A要和C通信,A发出找Cip和端口的信息,B在网桥中的那一块网卡看到A的信息后发现不是自己就丢弃这个包,C在网桥中的那一块网卡看到A的信息发现就是自己的ip就会信息转发给C这个容器中的那块网卡里(如下图2)
4)网桥再和宿主机连接,连接到eth0上,这样所有容器可以与宿主机通信:A要与外网一个IP和端口通信,(外网与子网掩码相与,发现不是内网Ip,就不在网桥内广播了)网桥会把A的信息发到宿主机的网卡上(如下图3),需求ipv4_fordward
iptables:4表5链
外网访问容器:目的地址:Hostip:port-->contianerip:port 源地址:本机Ip:port-->宿主机Ip:port
(3)host模式:直接使用宿主机的网络,容易发生端口冲突(编译容器的时候用host模式/host模式可以当路由);如下图容器直接与宿主机通信
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模式:内置网络模式,与以上几种物理层面的网络模式不同,同一个宿主机中不同容器互相通信
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