为什使用 Docker?
为什么要使用 Docker?就个人而言,Docker 能提供的最大便利在于这种技术面对程序环境迁移时所表现的卓越性。
这种性能使得我们不必在分享代码或项目合作、交接时附带一长串的环境配置指南进行版本限制和扩展描述;也不必再特意记录自己对现有环境的配置改变,以免下次系统迁移时手足无措;更为重要的是,Docker 在提供以上解决方案的同时没有把解法变得复杂,相反的,它提供了一种更快、更容易的方式。
Docker 独到的对增量和文件层的应用,使得镜像下载、共享 & 隔离、版本控制等问题的解决方法变得格外优雅。有兴趣的读者可以参考「循序渐进学 Docker」这本书。
下载 & 安装
下载
访问下面的网址,从菜单的 Get Docker 中选择适合的版本进行下载。
https://www.docker.com/
安装
Mac 和 Windows 中都可以使用桌面版傻瓜式安装,而 Centos 中的安装会受限于系统内核版本,可查看 参考链接。
安装完成后,可以通过以下方式查看 Docker 版本:
docker --version
更改镜像源
国内访问官方镜像的速度较慢,可以选用国内的镜像源,这里给出 DaoCloud 和阿里云的镜像源,镜像源更换方法在以下网址中都有说明:
DaoCloud: https://www.daocloud.io/mirror
AliCloud: https://cr.console.aliyun.com/#/accelerator
镜像市场
可以从以下网址中搜索需要的镜像:
官方:https://store.docker.com/
DaoCloud: http://hub.daocloud.io/
AliCloud:https://dev.aliyun.com/
名词解释
- 镜像:从镜像市场中下载的即为镜像,可以理解为容器的模板。
- 容器:应用程序运行的环境,容器的创建依赖于某一镜像。注意,容器不是镜像的拷贝,容器只是在镜像之上建立了一层读写层,用以覆盖容器内对镜像配置、文件的修改。采用这一方式可以避免因频繁的镜像复制而导致的资源浪费。具体可以参考相关书籍或博客。
镜像与容器
镜像的搜索与获取
搜索镜像
可以在安装了 Docker 的机器上使用以下指令搜索镜像,不过还是建议通过访问镜像商店的方式搜索。注意,$mirror-name 需要替换为想要搜索的镜像名。
docker search $mirror-name
获取镜像
可以使用以下指令拉取镜像到本地,其中冒号后的 $tag 为镜像的版本标签,如果省略冒号及之后的内容,则为下载最新版本即 :latest。版本标签信息可以在镜像市场中查找到。
docker pull $mirror-name:$tag
注意,若下载的镜像携带有版本标签,则之后对这一镜像的使用都需要携带版本标签,否则会因为版本不同而再次下载。
镜像的查看与删除
查看镜像
查看所有镜像可以使用:
docker images
也可通过以下方式查看单个镜像:
docker images $mirror-name
删除镜像
我们可以通过以下方式删除镜像,但此时需要保证没有容器使用这一镜像:
docker rmi $mirror-name
查看容器
查看已启动的容器
docker ps
查看全部容器
docker ps -a
查看容器日志
采用以下方法可以查看容器的操作历史和输出:
docker logs $container-name
启动容器
生成容器
可以通过以下方式生成一个基于某一镜像的容器,注意,如果宿主机中没有该镜像则会先进行下载。务必注意镜像标签是否正确。
docker run $mirror-name:$tag
使用这一命令会使得容器在创建后自动启动。
给容器添加自定义名字
通过 docker ps -a 可以看到容器的 ID 和 name,这两者都可以作为后续对容器删除、启动、关闭及设置等操作的标识。使用 ID 时,只需输入 ID 的前几位即可(能与其他容器区分)。
Docker 会为其随机生成 64 位长度的字符串作为 ID,当然,我们也可以通过如下方式手动指定容器的名字,其中 $container-name 即为指定的容器名。
docker run --name $container-name $mirror-name
启动容器
docker start $container-name
关闭容器
docker stop $container-name
以交互方式创建容器
可以通过以下方式,以交互的方式创建容器,当然也可以在 $mirror-name 的前面加上 --name xxx 来指定容器的名字,在交互模式中,可以输入 exit 退出:
docker run -it $mirror-name
以后台运行方式创建容器
我们可以使用 -d 操作使容器在后台运行:
docker run -d $mirror-name
容器状态问题
容器在启动后,如果没有活动的前台进程,容器会自动关闭。若要保持容器启动状态,可以强制其执行一个前台进程。
可以用以下方式创建一个不自动关闭的 centos 镜像:
docker run -it --name mycentos centos docker start mycentos // 此时可以看到该容器没有自动关闭 docker ps
容器执行操作
我们可以通过以下方式对已经启动的容器执行一些操作,其中 $container-name 可以是容器的名字,也可以是容器的 ID:
docker exec $container-name echo "hello" && echo "world"
也可以通过以下方式进入交互模式:
docekr exec -it $container-name bash
其中,&& 是起到操作间连接的作用。此外,我们也可以在创建的容器的时候就使其执行一些操作:
docker run $mirror-name echo "hello world"
查看容器详情
通过以下方式可以查看容器的详细信息,这些信息是采用 JSON 的格式展现的:
docker inspect $container-name
删除容器
可以在 rm 之后加入一个或多个容器名或容器 ID 进行批量删除。
docker rm $container-name-1 $container-name-2 ...
可以使用以下方法删除全部容器:
docker rm $(docker ps -aq)
Docker 网络
网络类别
查看网络类别
网络的类别为 none,host,bridge 三种,可以通过以下方式查看:
docker network ls
none 型网络
顾名思义,此类网络表示容器为独立个体,不与外部通信。
host 型网络
此类网络表示该容器与宿主机(安装 Docker 的机器)共享网络。
bridge 型网络
这是容器的默认网络类型,网桥模式意味着容器间可以互相通信,而对外的通信需要借助宿主机,这一形式通常表现为端口号的映射。
查看网络类别详情
docker network inspect $network-name
通过这种方式可以查看 JSON 格式的网络类别,在 Containers 条目中可以看到使用当前网络类型的容器列表,注意 Containers 中只会显示那些已经启动的容器。
创建网络
可以通过以下方式创建一个网络,其中,$network-driver 表示网络类别,即 none 或 bridge 或 host,而 $network-name 为自定义的网络名:
docker network create --driver $network-driver $network-name
如果省略 --driver $network-driver 则默认创建 bridge 类型的网络。
为容器指定网络
我们可以创建自定义的网络环境,并将一些容器放入这一网络内,以此管理容器间的网络连通情况。这种局域网网段的模拟实际是由内部 DNS 实现的。以下罗列将容器添加或移除到某一网络中的方法。
将容器添加进某一网络
可以通过以下方式将容器 $container-name 加入 $network-name 网络中。注意,一个容器可以属于多个网络。
do

