Linux 可以,Mac 不行。Mac 系统无法从主机访问容器。
docker inspect CONTAINER | grep IPAddress
# host:8001 -> container:8000
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
指通过终端访问容器,有两种方式:
docker exec -it centos bash # -it, interactive + tty
docker attach centos
# 容器ID 目标仓库/镜像名:Tag
docker commit -m="install zookeeper hadoop hive" 3a408c8747f3 centos/bigdata:v1
docker images
创建一个目录,在目录中新建文件 docker-compose.yml
,内容如下:
# 样板(包含两个服务)
version: "1"
nginx:
image: "nginx:latest"
...
redis:
image: "redis"
...
然后:
docker-compose up -d # 启动
docker-compose ps
网络类型主要是 bridge 和 host 两种。
bridge
就是一个 172.x.x.x
的子网,默认所有容器都在这个子网里面,可以互通。
host
就是共用主机端口,如果容器中的服务在 8000 端口,那么直接访问主机的 8000 端口即可。在容器中执行 ifconfig 看到的是主机中的信息。对于 Docker for Mac,这里的主机其实是 xhyve 虚拟机,所以从真正的主机无法访问容器。
docker network ls # 可用网络及类型
docker network inspect bridge # 详细信息
# 新建一个 bridge 类型的网络并添加容器
docker network create --driver bridge isolated_nw
docker run --network=isolated_nw -itd --name=container3 busybox
更多见 Docker container networking。
run = create + start,即从 Image 创建 Container,然后启动 Container。start 仅仅是启动已存在的 Container。
Machine 是为了在不同平台上可以一键安装 Docker 而抽象出来的一层,屏蔽了安装细节。
# 下面是在 virtualbox 和 digitalocean 上安装 docker
docker-machine create -d virtualbox m1
docker-machine create -d digitalocean --digitalocean-access-token=... m2
docker-machine ls
docker run busybox echo hello world # 在状态为 active 的 machine 上执行,即 default machine
Mac:右上角图标 -> Preferences -> Daemon -> Registry mirrors 添加
http://8df7d564.m.daocloud.io
在 macOS 10.10 Yosemite 及以后的版本上,Docker 不再运行在 VirtualBox 上,而是运行在 HyperKit 上面,它基于 Hypervisor.framework 的轻量级虚拟化方案。
Docker for Mac 不需要用 docker-machine,安装时将提供一个 HyperKit 虚拟机,它基于 Alpine Linux。
早先的一个安装器,为了方便在 Mac 和 Windows 上安装 Docker。这时的 Docker 还运行在 Virutalbox 上。
现在已被 Docker for Mac 和 Docker for Windows 替代。
Docker 与 Dockerfile 类似 make 与 makefile。它用来描述如何创建一个 Image。
容器编排工具,一个容器(类似 Git 仓库)一般只放一个服务,一个应用可能包含多个服务,就用 docker-compose.yml
来组织,通过它可以一次启动多个相关的容器。
不可以。Linux 中的网桥 docker0 是可见的,但是 Mac 中的 docker0 不可见,隐藏在 HyperKit 里面。
有两种方法,一种是将当前容器提交(docker commit
)为镜像,另一种是通过 Dockerfile 构建(docker build
)。
run = create + start + exec。用于执行一次性命令,如果执行 bash 命令可进入容器。停止后可以再 start。
up = create + start。用于创建关联容器并启动所有服务。如果没有指定后台服务,则会退出,即容器停止,也无法 start。
run 默认将启动所有关联服务,除非已经在运行。使用 --no-deps
选项可避免。
up 构建所有相关容器。如果容器已经存在则停止并重建,使用选项 --no-recreate
可避免。
创建的容器在名称上也有差别,前者多一个 'run' 字。
run 创建的容器在 docker-compose ps
中不可见。
rm 会将 run 和 up 产生的容器一起删除。
Registry 相当于 Github,Repository 相当于 Git 仓库,Image 相当于 Commit,Image 也可以打 Tag。
所以一个 Registry 中包含很多 Repository,一个 Repository 中包含很多 Images 版本。
而 Registry 也有一个 Repository,好比将 Github 的项目源码放到 Github 上,所以它也可以 run 或者 fork。
Docker Hub 是 Docker 官方的 Registry 的名称。