0%

Docker入门篇

容器简介

奔驰车生产好之后,经过集装箱封装,从纽约运送到了上海,开箱后奔驰车无损,可以正常使用。软件开发好之后,经过集装箱封装,从Ubuntu运送到了CentOS,开箱后软件无损,可以正常运行。
这种软件集装箱技术,就是容器技术,英文叫做 Linux Container。

起初,容器技术做的最好的就是Docker,Docker也几乎就是容器的代名词,后来CoreOS、Mesos、Containerd也都相继发展壮大。为了统一容器标准,OCI(Open Container Initiative)组织成立了,并于2016年4月推出了第一个开放容器标准,标准主要包括image镜像标准和runtime运行时标准。

Docker简介

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

Docker通常用于如下场景:

  • web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。

Docker安装

1、在virtualbox中打开centos7,安装yum-utils。
yum install yum-utils

2、添加docker-ce源。

1
2
3
4
# 官方源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云源,国内更快
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、更新yum包。
yum makecache fast

4、安装docker-ce。
yum install docker-ce

5、启动docker-ce并设置开机启动

1
2
systemctl start docker
systemctl enable docker

镜像加速器

DaoCloud

使用 Docker 的时候,需要经常从官方获取镜像,但是拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此DaoCloud推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。

1、访问DaoCloud官网,注册一个账号。

2、访问配置 Docker 加速器,可以获得一个专属加速地址(每次访问都会获得不同的地址)。

3、参考Docker 加速器,创建或修改 /etc/docker/daemon.json,内容为:

1
2
3
4
5
6
{
"registry-mirrors": [
"http://2fd0f33c.m.daocloud.io"
],
"insecure-registries": []
}

4、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

5、验证配置
docker info

阿里云

除了使用DaoCloud的镜像加速器,还可以使用阿里云的镜像加速器

1、访问阿里云镜像加速器,得到一个专属的加速地址。

2、对于CentOS7平台,创建或修改 /etc/docker/daemon.json,内容为:

1
2
3
{
"registry-mirrors": ["https://7ifvshz6.mirror.aliyuncs.com"]
}

3、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

4、验证配置
docker info

腾讯云

修改 /etc/docker/daemon.json 配置为:

1
2
3
4
5
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}

其他步骤同上。

Docker使用

基本命令

1
2
3
4
5
6
7
8
9
# 查看版本
docker version

# 查看帮助
docker

# 查看docker start帮助
docker start --help
docker help start

镜像查找下载

在docker的镜像索引网站上面,镜像都是按照 用户名/镜像名 的方式来存储的。有一组比较特殊的镜像,比如ubuntu这类基础镜像,经过官方的验证,值得信任,可以直接用镜像名来检索到。

1、在docker的镜像索引网站查找镜像:https://hub.docker.com/

2、使用命令行的工具查找tutorial镜像。
docker search tutorial

3、通过docker命令下载tutorial镜像。
docker pull learn/tutorial

hello world

docker镜像运行起来,便会生成一个docker容器,docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。

docker run learn/tutorial echo "hello world",在learn/tutorial镜像中运行”echo”命令,输出”hello world”。

安装新程序

docker run learn/tutorial apt-get install -y ping
tutorial镜像是基于ubuntu的,所以可以使用ubuntu的apt-get命令来安装ping程序。
命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
在执行apt-get命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。

查看容器

1
2
3
4
5
6
7
8
9
10
11
# 查看运行中的容器
docker ps

# 根据容器id查看容器详细信息(不需要完整id)
docker inspect efe234

# 查看最新历史容器
docker ps -l

# 查看所有容器
docker ps -a

保存容器的修改

对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。docker中保存状态的过程称之为committing,它保存的新旧状态之间的区别,从而产生一个新的版本。

docker ps -l,获得安装完ping命令之后容器的id。

docker commit 8cacc6f8a25f learn/ping,把这个容器保存为镜像learn/ping。

运行新的镜像

我们已经建立了docker环境,并且安装了ping命令在里面。它可以在任何支持docker环境的系统中运行,让我们来体验一下吧!

docker run learn/ping ping www.baidu.com,在新的镜像中运行ping www.baidu.com命令。

发布docker镜像

现在我们已经验证了新镜像可以正常工作,下一步我们可以将其发布到官方的索引网站。还记得我们最开始下载的learn/tutorial镜像吧,我们也可以把我们自己编译的镜像发布到索引页面,一方面可以自己重用,另一方面也可以分享给其他人使用。

docker push learn/ping,把learn/ping镜像发布到docker的索引网站。

注意:只能将镜像发布到自己的空间下面,这个模拟的是learn帐号。

删除容器和镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 删除单个容器
docker rm efe234

# 删除所有容器
docker rm $(docker ps -a -q)

# 删除单个镜像
docker rmi 234a

# 强制删除单个镜像
docker rmi 234a -f

# 删除所有镜像
docker rmi $(docker images -q)

# remove all stopped containers, all networks not used by at least one container, all dangling images, all build cache
docker system prune
docker system prune -a

# remove all above and all volumes not used by at least one container
docker system prune -a --volumes

# Do not prompt for confirmation
docker system prune -f

# remove all stopped containers
docker container prune

# remove all dangling images
docker image prune

# remove all networks not used by at least one container
docker network prune

# remove all volumes not used by at least one container
docker volume prune

# 删除所有悬空镜像,不删除未使用镜像
docker rmi $(docker images -f "dangling=true" -q)

# 删除所有未使用镜像和悬空镜像
docker rmi $(docker images -q)

# 删除所有未被容器引用的卷
docker volume rm $(docker volume ls -qf dangling=true)

# 删除所有已退出的容器
docker rm -v $(docker ps -aq -f status=exited)

# 删除所有状态为dead的容器
docker rm -v $(docker ps -aq -f status=dead)

高级命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 拷贝文件
docker cp -a /opt/www/voidking/ 96f7f14e99ab:/opt/www/
docker cp -a /opt/www/voidking/ containername:/opt/www/

# 启动mysql
docker run --name vk-mysql -d \
-p 3306:3306 \
-v /opt/data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=voidking \
mysql:5.6

# 查看容器进程ID
docker ps
docker top 9b40a74ceb82
docker inspect 9b40a74ceb82 | grep pid -i

# 查看容器进程的namespace
ll /proc/$$/ns
ll /proc/8418/ns

# 在容器net namespace执行命令
nsenter -t 8418 -n ip add
nsenter -t 8418 -n route -n
nsenter -t 8418 -n iptables -A OUTPUT -p tcp --dport 7535 -j DROP

Docker镜像迁移

在不联网的情况下,怎样把 docker image 分享给局域网的其他用户?

单个镜像

1、在本机执行 docker save -o ubuntu.tar ubuntu ,由此得到了 ubuntu.tar 文件。

2、将 ubuntu.tar 拷贝到其他机器,执行 docker load < ubuntu.tar

全部镜像

1
2
3
4
5
# 导出镜像
docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o all.tar

# 导入镜像
docker load -i all.tar

书签

什么是Docker?

docker入门教程

Docker入门实战

中国第一套Docker实战案例视频课程(入门到高级)

Docker实战案例源码

Docker实战案例文档