但是如果每次访问远程服务都需要调用docker -H命令会显得繁琐
可以配置环境变量 利用export命令
[root@bogon docker]# export DOCKER_HOST="tcp://192.168.174.134:2375"
此时利用docker info命令可以看到它默认连接上了远程服务端
Registry: https://index.docker.io/v1/ Labels: name=docker-server_1 Experimental: false
当然如果想默认连接本机可以利用export命令即Docker-HOST的内容置空,即空字符串
二、Dockerfile指令
1、FROM <image> 表示来自哪个镜像
2、MAINTAINER <name> 用于指定镜像的作者信息,包含镜像的所有者和联系信息
3、RUN命令:在容器构建过程中运行:如安装nginx
1) RUN <commad> (shell模式) 如:RUN echo hello
2) RUN ["executable","paam1","param2"] (exec模式) 如:RUN["/bin/bash","-c","echo hello"]
4、EXPOSE <port> [<port>..] 指定运行该镜像的容器使用的端口号
5、在容器运行时运行的,用于执行什么指令,如运行nginx,不过此命令会被docker run 启动命令覆盖
1) CMD ["executable","paam1","param2"] (exec模式)
2) CMD command param1 param2(shell 模式)
6 、ENTRPOINT :与CMD命令相似,只是=此命令不会被docker run 启动命令覆盖
1) ENTRYPOINT ["executable","paam1","param2"] (exec模式)
2) ENTRYPOINT command param1 param2(shell 模式)
7、ADD 将宿主机文件复制到创建容器
ADD <src>..<dest>
ADD ["src"..""<>dest](适用于文件路径中有空格的情况)
COPY <src> .. <dest>
COPY ["src"..""<>dest](适用于文件路径中有空格的情况)
区别:
ADD 包含类似tar的解压功能
如果单纯复制文件,Docker推荐使用COPY
8、VOLUME ["/data"] :用于为创建的容器创建数据卷,用于数据持久化
9、WORKDIR /path/to/workdir :在容器内部设置工作目录,那么如cmd命令都会在指定的目录下进行
10、ENV <key><value>
ENV <key>=<value>..
11、USER daemon 指定用户
如 USER nginx
三、容器的互联
参考:https://blog.csdn.net/q13554515812/article/details/84325647
http://wiki.jikexueyuan.com/project/docker-technology-and-combat/con_port_mapping.html
1) 容器之间的互联访问
如果在同一个局域网下,容器之间是通过虚拟网桥连接的,所以相互之间可以互联通信,但是每次重新启动一次容器,其ip地址会发生变化
为了防止此变化可以通过link命令进行连接
[root@bogon ~]# docker run -it --name cct1 centos [root@bogon ~]# docker run it --name cct2 --link=cct1:webtest centos #ctr+P+q [root@131b9fc5eea4 etc]# ping cct1 PING webtest (172.17.0.2) 56(84) bytes of data. 64 bytes from webtest (172.17.0.2): icmp_seq=1 ttl=64 time=0.157 ms 64 bytes from webtest (172.17.0.2): icmp_seq=2 ttl=64 time=0.135 ms
2) 拒绝所有容器间互联(处于安全考虑)
Docker守护进程的启动选项
--icc=false
此针对于centos7系统配置
[root@bogon docker]# pwd /etc/docker [root@bogon docker]# ll 总用量 20 drwxr-xr-x. 5 root root 72 12月 15 23:23 certs.d -rw-r--r--. 1 root root 120 1月 2 21:15 daemon.json -rw-------. 1 root root 244 12月 15 23:24 key.json -rw-r--r--. 1 root root 10837 12月 7 23:42 seccomp.json [root@bogon docker]# vim daemon.json
{ "registry-mirrors": ["https://1mz9i0xi.mirror.aliyuncs.com"], "labels": ["name=docker-server_1"], "icc":false }
[root@bogon docker]# systemctl restart docker [root@bogon docker]# docker restart cct1 cct2 cct1 cct2 [root@bogon docker]# docker attach cct2 [root@131b9fc5eea4 /]# ping cct1 PING webtest (172.17.0.2) 56(84) bytes of data. #程序进程被卡住 ^C
3) 允许特定容器间的连接
Docker守护进程的启动选项
--icc=false #设置拒绝所有访问
--iptable=true #配置iptables 此与上命令置于daemon.json
--link #利用link命令单独连接
如:{ ... "icc": false, "iptables": true, ... }
四、Docker容器与外部网络的连接
ip_forward
iptables (centos7为firewalld)
允许端口映射访问
限制IP访问容器
1、--ip-forward=true
sysctl net.ipv4.conf.all.forwarding
1) 查看ipv4的值
[root@bogon docker]# sysctl net.ipv4.conf.all.forwarding net.ipv4.conf.all.forwarding = 1 #该值为1
2) 启动一个容器,其镜像是基于拥有nginx服务的镜像
[root@bogon ~]# docker run -it -p 80 --name cct5 cento [root@de032d9b3734 /]#nginx [root@de032d9b3734 /]# [root@bogon ~]# [root@bogon ~]# docker port cct5 80/tcp -> 0.0.0.0:32768 [root@bogon ~]# curl 127.0.0.1:32768 #此时可以看到nginx首界面
3) 在另外一台宿主机上启动docker,并尝试连接cct5的容器
[root@bogon ~]# curl 192.168.174.128:32768 #此时能正常访问
说明当我们建立端口映射时,iptables会加入一条规则允许外部容器的访问
4) 可以通过iptables添加规则来阻止或指定特定容器的连接
4.1) 先查询指定所要阻止的容器所在的ip,如这里是192.168.174.128
4.2) 重新启动一个容器:此容器与阻止访问的容器不再同一个宿主机上
[root@bogon ~]# docker run -it -p 80 --name cct6 cento [root@de032d9b3734 /]#nginx [root@de032d9b3734 /]# [root@bogon ~]# [root@bogon ~]# iptables -L -n Chain DOCKER (1 references) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:80 #此时iptables添加的容器映射
4.3) 添加规则
[root@bogon ~]# iptables -I DOCKER -s 192.168.174.128 -d 172.17.0.3 -p TCP --dport 80 -j DROP
4.4) 此时通过另台宿主机(192.168.174.128)容器访问172.17.0.3的容器,进程会卡主连接不上,说明阻止成功
五、Docker容器数据卷
1、什么是数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用 *数据卷的使用,类似于 Linux 下对目录或文件进行 mount