Docker容器管理
容器是Docker第二个核心概念,简单的的说容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。 如果说虚拟机是模拟运行了一整套操作系统(提供运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个或一组应用,以及他们的必须运行环境。
新建容器
Docker的容器十分轻量,用户可以随意的创建或删除容器。 可以使用docler create创建一个容器,比如创建一个Mysql的容器:
docker create -it mysql:latest
然后使用ps命令就可以查看所有的容器,不过要加上-a参数,因为create后的容器默认是不开启的。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f660cfdf9b1 mysql:latest "/entrypoint.sh --na About a minute ago goofy_newton
d8990fec2141 ubuntu:latest "/bin/bash" 3 hours ago Exited (0) 3 hours ago serene_payne
如果要开启这个容器,就需要docker start
docker start 5f660cfdf9b1
在start可以加ID,也可以加容器的名字,可以用--name在创建的时候为容器起名字,如果不起名的话,docker会自动为它分配一个。
新建并启动容器
启动容器的方式有两种,一是创建一个容器并启动这个容器,另一种就是一个将一个处于中止状态的容器重新启动。 如果是创建一个容器并立即启动,就是使用的docker run命令,这个命令等价与docker create 加 docker start。 当用docker run来创建一个容器时,操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟借口到容器中去
- 从地址池配置一个IP地址给容器
- 执行用户制定的应用程序
- 执行完毕后容器被终止
比如使用ubuntu镜像执行bash终端:
docker run -t -i ubuntu:14.04 /bin/bash
root@ce5e7fe50200:/#
其中-t参数是让docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。 exit或ctrl+D退出之后,容器也就处于了终止状态,因为bash程序结束了。 更多时候,需要容器在后台以守护态运行,可以通过添加-d参数来实现。 比如:
docker run -d ubuntu:14.04
终止容器
可以使用docker stop终止一个正在运行的容器,命令格式为:
docker stop [-t|--time[=10]]
它会首先想容器发送SIGTERM信号,然后等待一段时间(默认10s),再发送SIGKILL信号终止容器。 当然,可以使用docker kill命令直接发送SIGKILL信号强行终止容器。 如果想重新启动一个容器只需要docker restart
进入容器
因为在使用-d参数之后,容器启动之后便会进入后台,用户无法看到容器中的信息,某些时候需要近土容器进行操作,有多种方法进入容器,包括docker attach命令、docker exec命令,以及nsenter工具。
attach命令
docker attach是docker自带的命令,使用简单docker attach 后面跟ID或容器名就可以,不过attach命令有时候并不方便,当多个窗口同时attach到同一个容器的时候,所有的窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也就没法进行别的操作了。
exec命令
这也是昨天看直播的时候讲到的命令,目测很好用,exec是docker 1.3版本提供的工具,可以直接在容器内运行命令,例如进入一个容器并启动一个bash:
docker exec -ti [ID|NAME] /bin/bash
nsenter工具
nsenter是util-linux包2.23版本后包含的工具,并不是docker的自带工具,需要安装util-linux包,使用起来稍麻烦,不打算尝试。
删除容器
使用docker rm指令便可以删除指定容器,语法格式:
docker rm [OPTIONS] CONTAINER[CONTAINER..]
支持的选项包括:
- -f,--force=false 强行终止并删除一个运行中的容器
- -l,--link=false 删除容器链接,但保留容器
- -v,--columes=false删除容器挂载的数据卷
导出容器
导出容器是指导出一个已经创建好的容器到一个文件,不管这个容器是否处于运行状态都可以导出。 使用导出命令docker export命令,该命令使用格式为:
docker export CONTAINER
比如:
docker export boring_galileo > dbserver.tar
可以将这些文件传输到其他机器上,在其他机器通过导入命令实现容器的迁移。
导入容器
导出的文件又可以使用docker import命令导入,成为镜像,例如: 把刚才导出的文件再导入:
cat dbserver.tar | docker import - dbserver:lastest
这个效果和Docker镜像的创建、存出、载入中的基于本地模板导入非常一致。 实际上,既可以通过docker load导出镜像存储文件到本地镜像库,又可以使用docker import命令导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢失所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
Docker镜像的创建、存出、载入
创建镜像的方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。昨天csphere培训用的便是最后一种,不过Dockerfile文件是已经被写好的了,所以再还不会写Dockerfile的情况下,先不写这种方法创建镜像。
基于已有镜像的容器创建
该方法是使用docker commit命令,其命令格式为:
docker commit[OPTIONS] CONTAINER[REPOSITORY[:TAG]]
主要参数选项包括:
- -a ,--author="" 作者信息
- -m,--message="" 提交信息
- -p,--pause=true 提交是暂停容器运行
比如,先创建一个运行bash的ubuntu容器:
docker run -it ubuntu /bin/bash
root@d8990fec2141:/# touch test
root@d8990fec2141:/# exit
然后根据创建的这个容器来提交一个新的镜像,提交时需要用到容器ID。
docker commit -m "test" -a "HypoChen" d8990fec2141 testimage
如果成功的话,就会返回新镜像的长ID号,然后可以查看看在本地已有的镜像:
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
testimage latest baea98d5a437 About a minute ago 188.3 MB
ubuntu 14.04 fa81ed084842 3 days ago 188.3 MB
ubuntu latest fa81ed084842 3 days ago 188.3 MB
第三行就是刚刚创建的镜像。
基于本地模板导入
也可以从操作系统模板文件导入一个镜像,比如使用OpenVZ提供的模板创建,OPENVZ下载模板在:http://openvz.org/Download/template/precreated。 我尝试使用了Ubuntu14.04的模板,在vps里直接下载了:
wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
不过不得不说腾讯云下载东西好慢啊,75M的东西让我等了好久,差评。 下载完之后就可以导入了:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
其实只是两个命令,不过很显而易见,就不加解释了。成功的话,就会返回根据模板建立的镜像的长ID 然后就可以查看本地的镜像:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
ab80404d13d580965b9919b640169ccb585ea7884e6aa9de1ec043075c65fe35
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ab80404d13d5 56 seconds ago 215.4 MB
testimage latest baea98d5a437 29 minutes ago 188.3 MB
ubuntu latest fa81ed084842 3 days ago 188.3 MB
其实可以看出,虽然模板才75M,但创建的镜像并不小。
镜像的存出和载入
可以利用docker save和docker命令来存出和载入镜像。
存出镜像
如果想要把镜像存出到本地文件,可以使用docker save命令,例如,存出本地的刚才创建的testimage:lastest为镜像文件testimage.tar文件:
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
testimage latest baea98d5a437 25 minutes ago 188.3 MB
ubuntu latest fa81ed084842 3 days ago 188.3 MB
ubuntu 14.04 fa81ed084842 3 days ago 188.3 MB
docker save -o /data/testimage.tar testimage:latest
上面的第6行就是存出代码,这时在/data下就有一个testimage.tar文件,这时我们把本地镜像rmi掉,然后尝试载入。
载入镜像
删除镜像之后的状态:
ubuntu@VM-223-238-ubuntu:/data$ docker rmi baea98d5a437
Untagged: testimage:latest
Deleted: baea98d5a4371a6abf9efc8c53a54a6fc5befd167bf91ce9fd4a28a6d1b7dc5b
ubuntu@VM-223-238-ubuntu:/data$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ab80404d13d5 5 minutes ago 215.4 MB
ubuntu latest fa81ed084842 3 days ago 188.3 MB
然后载入镜像:
docker load --input testimage.tar
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ab80404d13d5 6 minutes ago 215.4 MB
testimage latest baea98d5a437 35 minutes ago 188.3 MB
ubuntu latest fa81ed084842 3 days ago 188.3 MB
第一行就是载入镜像,还可以简化写成:
docker load
载入操作将会导入镜像以及相关的元数据信息(包括标签等)。
镜像的上传
最后说点镜像的上传,镜像的管理方式非常像git,可以使用docker push命令上传自己本地镜像到仓库,默认上传到DockerHub官方仓库(需要登陆),命令格式:
docker push NAME[:TAG]
在上传之前一般会先为自己的镜像添加带自己名字(作者信息)的标签:
docker tag testimage:lastest hypochen/testimage:lastest
docker push hypochen/testimage:lastest
有利于上传之后的区分。 我觉得无论是运维团队还是开发团队还是一个实验室,都有必要有一个自己的Docker仓库,可以存放符合自己需求的环境或系统镜像,可以实现快速部署。 但是镜像和代码不一样,代码我们可以用github,但镜像动辄几十M,我觉得开源理工有必要做一个本地镜像站来代替DockerHub,并且提供校内的镜像托管服务,这将十分有利用代码的快速部署。
Copyright © 2020 Powered by MWeb, Theme used GitHub CSS.