Skip to content

Instantly share code, notes, and snippets.

@ericzhong
Last active November 24, 2017 10:04
Show Gist options
  • Save ericzhong/170a3863b0ae9e021dc0bca4642772ef to your computer and use it in GitHub Desktop.
Save ericzhong/170a3863b0ae9e021dc0bca4642772ef to your computer and use it in GitHub Desktop.
Docker 安装与使用

安装

操作

端口转发

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

使用 compose

创建一个目录,在目录中新建文件 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

问题

docker run 与 start 的区别

run = create + start,即从 Image 创建 Container,然后启动 Container。start 仅仅是启动已存在的 Container。

docker-machine

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

使用第三方 Registry

Mac:右上角图标 -> Preferences -> Daemon -> Registry mirrors 添加

http://8df7d564.m.daocloud.io

Docker for Mac

在 macOS 10.10 Yosemite 及以后的版本上,Docker 不再运行在 VirtualBox 上,而是运行在 HyperKit 上面,它基于 Hypervisor.framework 的轻量级虚拟化方案。

Docker for Mac 不需要用 docker-machine,安装时将提供一个 HyperKit 虚拟机,它基于 Alpine Linux。

Docker Toolbox

早先的一个安装器,为了方便在 Mac 和 Windows 上安装 Docker。这时的 Docker 还运行在 Virutalbox 上。

现在已被 Docker for Mac 和 Docker for Windows 替代。

Dockerfile

Docker 与 Dockerfile 类似 make 与 makefile。它用来描述如何创建一个 Image。

Docker Compose

容器编排工具,一个容器(类似 Git 仓库)一般只放一个服务,一个应用可能包含多个服务,就用 docker-compose.yml 来组织,通过它可以一次启动多个相关的容器。

Docker for Mac 端口转发

不可以。Linux 中的网桥 docker0 是可见的,但是 Mac 中的 docker0 不可见,隐藏在 HyperKit 里面。

构建镜像的方法

有两种方法,一种是将当前容器提交(docker commit)为镜像,另一种是通过 Dockerfile 构建(docker build)。

docker-compose run 和 up 的区别

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 和 Repository 的区别

Registry 相当于 Github,Repository 相当于 Git 仓库,Image 相当于 Commit,Image 也可以打 Tag。

所以一个 Registry 中包含很多 Repository,一个 Repository 中包含很多 Images 版本。

而 Registry 也有一个 Repository,好比将 Github 的项目源码放到 Github 上,所以它也可以 run 或者 fork。

Docker Hub 是 Docker 官方的 Registry 的名称。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment