容器简介
奔驰车生产好之后,经过集装箱封装,从纽约运送到了上海,开箱后奔驰车可以跑在上海的大街上。
软件在环境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系统有两个程序:docker服务端和docker客户端。
其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。
Docker优点:
Build, Ship and Run.
Build once, run anywhere.
Docker安装
以centos7系统为例。
1、安装yum-utilsyum install yum-utils
2、添加docker-ce源
1 | 官方源 |
3、更新yum包yum makecache fast
4、安装docker-ceyum install docker-ce
5、启动docker-ce并设置开机启动
1 | systemctl start docker |
镜像加速器
DaoCloud
使用 Docker 的时候,需要经常从官方获取镜像,但是拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此DaoCloud推出了加速器工具解决这个难题,通过智能路由和缓存机制,提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。
1、访问DaoCloud官网,注册一个账号。
2、访问配置 Docker 加速器,可以获得一个专属加速地址(每次访问都会获得不同的地址)。
3、参考Docker 加速器,创建或修改 /etc/docker/daemon.json,内容为:
1 | { |
4、重启docker
1 | systemctl daemon-reload |
5、验证配置docker info
阿里云
除了使用DaoCloud的镜像加速器,还可以使用阿里云的镜像加速器。
1、访问阿里云镜像加速器,得到一个专属的加速地址。
2、对于CentOS7平台,创建或修改 /etc/docker/daemon.json,内容为:
1 | { |
3、重启docker
1 | systemctl daemon-reload |
4、验证配置docker info
腾讯云
修改 /etc/docker/daemon.json 配置为:
1 | { |
其他步骤同上。
Docker使用
版本和帮助
1 | 查看版本 |
镜像查找下载
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 | docker search busybox |
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的参数
启停容器
1、怎样停止一个正在运行的容器?docker stop vk-busybox
2、怎样再次运行一个已经停止的容器?docker start vk-busybox
开机启动容器
通过 systemctl enable docker
,我们已经设置了docker程序的开机自启动。
怎样让我们的容器也开机自启动呢?答:使用restart参数。
1 | docker run --restart=always vk-busybox |
查看容器
容器启动后,怎么查看这些容器?
答:使用docker ps命令或者docker inspect命令。
1、查看运行中的容器docker ps
2、查看历史容器docker ps -l
3、查看所有容器docker ps -a
4、查看容器启动命令docker ps --no-trunc
5、查看容器详细信息
1 | docker inspect <container_name> |
进入容器
容器启动后,怎样进入一个容器?
答:使用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 | docker rm <container_name> |
删除所有容器docker rm $(docker ps -a -q)
删除单个镜像
1 | docker rmi <image_name> |
删除所有镜像docker rmi $(docker images -q)
删除停止的容器、删除没有被使用的网络、删除没有被使用的镜像、删除构建产生的缓存
1 | docker system prune |
删除以上内容,同时删除没有被使用的volumesdocker system prune -a --volumes
删除没有被使用的volumesdocker 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 | docker ps |
查看容器进程的namespace
1 | ll /proc/$$/ns |
在容器net namespace执行命令(需要宿主机上有route命令)
1 | nsenter -t <pid> -n ip add |
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
书签
微信公众号
微信公众号的二维码,文章推送 + 资源分享,一起学习进步。