0%

Docker入门篇

容器简介

奔驰车生产好之后,经过集装箱封装,从纽约运送到了上海,开箱后奔驰车可以跑在上海的大街上。
软件在环境A开发好之后,经过集装箱封装,从环境A运送到了环境B,开箱后软件可以跑在环境B。
这种软件集装箱技术,就是容器技术,英文叫做 Linux Container。

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

Docker简介

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

Docker通常用于如下场景:

  • web应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。

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

Docker安装

以centos7系统为例。

1、安装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

镜像查找下载

github是存储代码的仓库,而docker hub是存储docker镜像的仓库。

docker hub上面的镜像命名方式为:
<username>/<imagename>:<tag>,比如voidking/nginx:v1.0
其中 tag 可以省略,省略则默认使用 latest 。

有一类比较特殊的镜像,经过官方的验证值得信任,命名方式为:
<imagename>:<tag>,比如 busybox:1.25

1、查找镜像
方法一:在docker hub上查找镜像,直接搜索即可
方法二:使用命令行的工具搜索,例如搜索 busybox 镜像

1
2
docker search busybox
curl -s "https://registry.hub.docker.com/v1/repositories/busybox/tags" | jq -r .[].name


2、通过docker命令下载镜像,例如下载 busybox 镜像
docker pull busybox:1.25

3、查看本地镜像
docker images

helloworld

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

看一个例子:
docker run busybox:1.25 echo "helloworld"

busybox:1.25 镜像作为模板启动一个容器,容器中运行echo程序,参数为”helloworld”。
容器启动后,输出了 helloworld ,然后就停止了。这是因为,1号进程(echo进程)停止了,容器也随之停止。

启动容器

一般的容器,应该怎么启动呢?
答:在启动容器时,指定一个长期运行的前台进程作为1号进程。
例如:
docker run --name vk-busybox -d busybox:1.25 sleep 3600
以上命令的含义:

  • docker run 表示启动一个容器
  • –name 指定容器名为 vk-busybox
  • -d 表示后台运行容器,并返回容器id
  • busybox:1.25 是镜像名
  • sleep 是1号进程,3600是sleep的参数

查看容器

容器启动后,怎么查看这些容器?
答:使用docker ps命令或者docker inspect命令。

1、查看运行中的容器
docker ps

2、查看历史容器
docker ps -l

3、查看所有容器
docker ps -a

4、查看容器启动命令
docker ps --no-trunc

5、查看容器详细信息

1
2
docker inspect <container_name>
docker inspect <container_id>

进入容器

容器启动后,怎样进入一个容器?
答:使用docker exec命令。
docker exec -it vk-busybox /bin/sh

修改容器并保存

进入容器后,我们对容器进行了修改,比如创建了一个文件 /tmp/test.txt 。
现在想要把这个容器保存成镜像,方便以后复用,该怎么操作?
答:使用docker commit命令,类似于git commit。

docker commit vk-busybox voidking/vk-busybox:v1.0
以上命令,把修改后的 vk-busybox 容器保存成了镜像 voidking/vk-busybox:v1.0 。
docker commit时,除了使用容器名称,也可以使用容器id。

分享镜像

我们在本地保存了 voidking/vk-busybox:v1.0 镜像,怎样把它分享出去?
答:使用docker push命令,类似于git push。
docker push voidking/vk-busybox:v1.0
该命令把 voidking/vk-busybox:v1.0 镜像推送到 docker hub,所属账户为 voidking 。

记得push前,需要docker login,进行登录鉴权。

删除容器和镜像

删除单个容器

1
2
docker rm <container_name>
docker rm <container_id>

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

删除单个镜像

1
2
3
4
docker rmi <image_name>
docker rmi <image_id>
docker rmi <image_name> -f
docker rmi <image_id> -f

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

删除停止的容器、删除没有被使用的网络、删除没有被使用的镜像、删除构建产生的缓存

1
2
3
docker system prune
docker system prune -a
docker system prune -f

删除以上内容,同时删除没有被使用的volumes
docker system prune -a --volumes

删除没有被使用的volumes
docker volume prune

删除停止的容器
docker container prune

删除没有被使用的镜像
docker image prune

删除没有被使用的网络
docker network 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)

拷贝文件

怎样在宿主机和容器之间互相拷贝文件?答:使用docker cp命令。
docker cp /tmp/test.txt vk-busybox:/tmp

查看容器id和容器进程

查看容器进程ID

1
2
3
docker ps
docker top vk-busybox
docker inspect vk-busybox | grep pid -i

查看容器进程的namespace

1
2
ll /proc/$$/ns
ll /proc/<pid>/ns

在容器net namespace执行命令(需要宿主机上有route命令)

1
2
3
nsenter -t <pid> -n ip add
nsenter -t <pid> -n route -n
nsenter -t <pid> -n iptables -A OUTPUT -p tcp --dport 7535 -j DROP

Docker镜像迁移

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

单个镜像

本机有镜像 busybox:1.25,现在想要把这个镜像导出到其他机器。

1、导出镜像
docker save -o busybox.tar busybox:1.25

2、导入镜像
docker load < busybox.tar

全部镜像

假设本机有很多个镜像,现在想要把些镜像全部导出到其他机器。

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

2、导入镜像
docker load -i all.tar

书签

什么是Docker?

docker入门教程

Docker入门实战

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

Docker实战案例源码

Docker实战案例文档

微信公众号

微信公众号的二维码,文章推送 + 资源分享,一起学习进步。