docker container networking Closed containers
Bridged containers (default)
custom name resolution 1 --hostname containerhostname
set primary DNS server
在此 DNS server 上配置容器的 IP 和 hostname
custome mapping for an IP address and host name pair:
所有映射均可在 /etc/hosts 中看到。
端口映射:
<containerPort>
<hostPort>:<containerPort>
<ip>::<containerPort>
<ip>:<hostPort>:<containerPort>
默认情况下,inter-container communication 的策略是完全访问,即同一个 docker0 bridge 下的所有容器都可以 ping 通其它容器。这其实是很不安全的,禁用方法:
我们可以通过修改 bridge interface 来控制:
define the address and subnet of the bridge
define the range of IP addresses that can be assigned to containers
define the maximum transmission unit (MTU)
1 --bip "192.168.0.128/25"
这样就会使 docker0 interface 的 IP 设为 192.168.0.128,允许 192.168.0.128-192.168.0.255 访问。 设置好后,容器的 IP 就会在这个区间分配,你可以为容器指定固定 IP:
1 --fixed-cidr "192.168.0.130/25"
如果需要设置 maximum size of a packet,(default 1500 bytes)
如何使用定制的 bridge:
Joined containers 1 docker run --net container:xxx
for example,
1 2 3 4 5 6 docker run -d --name brady \ --net none alpine:latest \ nc -l 127.0.0.1:3333 docker run -it \ --net container:brady \ alpine:latest netstat –al
即 network interface 版的 managed volume. 使用场景:
在a中修改网络配置使b中的生效。
在a中监控b的流量。
多个容易共用一个端口交流。
与容器未 expose 的端口通信。
Joined containers 允许你连接任何其它容器,但它还不是最不安全的,最不安全的是下面这个。
Open containers
Inter-container dependencies
link 不具有传递性:B->A, C->B =/= C->A. link 有一个特权:它可以连接没有 expose 任何端口号的容器。
Limiting risk with isolation memory limits
单位:b, k, m, g 这里需要注意的是设置为 256m 并不表示真会分配的到这么多,仅仅是为了防止使用超度。
1 2 3 4 5 6 docker run -d --name ch6_mariadb \ --memory 256m \ --cpu-shares 1024 --user nobody \ --cap-drop all \ dockerfile/mariadb
制作镜像 1 2 3 4 5 6 7 8 9 docker run --name rie \ -e ENV_A=a -e ENV_B=b \ --entrypoint "/bin/sh" \ busybox:latest \ -c "echo \$ENV_A" docker commit -a "carl" -m "just for example" rie zxfspace/rie
exporting and importing flat file systems 如果需要添加一个文件,用docker copy
;如果多个文件,docker export
; 将容器文件 copy 到 tar 包。
1 docker export --output export.tar container
Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 FROM ubuntu:latest MAINTAINER carl RUN echo 'hello' \ && echo 'world' ENV APPROOT="/app" \ APP="myapp" \ VERSION='0.1' LABEL base.name="hw" \ base.version="${VERSION} " WORKDIR $APPROOT ENTRYPOINT ["pwd" ] EXPOSE 3333
docker build -f df -t diy:1 .
不想加到 image 中的文件写到 .dockerignore 中。
1 2 3 4 5 6 FROM diy:1 COPY ["./" , "${APPROOT} " ] RUN chmod 111 ${APPROOT} /df VOLUME ["/docker/diy" , "/var/log" ] CMD ["echo 'hello'" ]