9.Docker容器的创建、启动、和停止
-
容器是独立运行的一个或一组应用,及他们的运行环境。容器是Docker中的一个重要的概念。
-
docker容器的启动有两种方式
-
基于镜像新建容器并启动
例如我们可以启动一个容器,打印出当前的日历表
docker run centos cal
-
我们还可以通过指定参数,启动一个bash交互终端。
docker run -t -i centos /bin/bash
参数-t让Docker分配一个伪终端并绑定在容器的标准输入上,-i让容器的标准输入保持打开。
-
使用docker run命令来启动容器,docker在后台运行的标准操作包括
1.检查本地是否存在指定的镜像,不存在则从公有仓库下载 2.使用镜像创建并启动容器 3.分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层 4.从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去 5.从地址池分配一个ip地址给容器 6.执行用户指定的应用程序 7.执行完毕之后容器被终止
-
将在终止状态的容器从新启动
可以使用docker start命令,直接将一个已经终止的容器启动运行起来。
docker start mysql
-
-
守护态运行
很多时候,我们希望容易在后台以守护态运行,此时可以添加-d参数来实现(d是daemon的首字母)
例如我们启动centos后台容器,每隔一秒打印当天的日历。docker run -d centos /bin/sh -c "while true;do echo hello docker;sleep 1;done"
启动之后,我们使用docker ps查看容器的信息
sudo docker ps
要查看启动的centos容器中的输出,可以使用
docker logs frosty_brahmagupta
-
终止容器
使用docker stop来终止一个运行中的容器。
并且可以使用docker ps -a来看终止状态的容器。docker ps -a
终止状态的容器,可以使用docker start来重新启动。
docker start
使用docker restart 命令来重启一个容器。
docker restart
10.进入后台运行的容器
- 在启动容器的时候,有时候我们加了参数-d,这时容器自动进入后台运行。这个时候我们要进入容器,怎么办?通常
使用docker attach命令和nsenter工具 - docker attach是Docker自带的命令。
docker run -idt /bin/bash docker ps docker attach infallible_brown
该命令有时候并不方便,因为他是同步的,若有多个用户attach到一个容器,一个窗口命令阻塞,其他窗口都无法执 行。 - nsenter命令:在util-linux包2.23版本后都有包含。nsenter可以访问另一个进程的名字空间。
安装:
为了链接到容器,需要知道容器的PID,可以使用nsenter获取,如下:wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar -zxvf util-linux-2.24.tar.gz cd util-linux-2.24 ./configure --without-ncurses && make nsenter cp nsenter /usr/local/bin
PID=$(docker-pid 5d1ba7f7affc)
docker-pid需要自己安装,否则找不到命令
获取了PID之后,就可以通过下面的命令进入容器了wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker; echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
nsenter --target 30027 --mount --uts --ipc --net --pid
11.导入、导出、删除容器
- 导出某个容器,非常简单,使用docker export命令
导出后在本地可以看到有一个centos.tar的容器快照。docker export 5d1ba7f7affc > centos.tar
- 有了容器快照之后,我们可以在想要的时候随时导入。导入快照使用docker import命令。
例如我们可以使用cat centos.tar | docker import - test/centos:7
导入容器快照作为镜像
处理本地的容器快照导入为镜像,我们还可以通过指定一个URL或者目录来导入。
例如在某个网络上有个快照image_test.tgzdocker import http://xxxx.com/image_test.tgz test/image_test
- docker中可以使用
docker load
来导入镜像,也可是使用docker import
来导入一个容器快照到docker镜像。两者的区别是容器快照将丢弃所有的历史记录和元数据信息。而镜像保存完整的记录,因此要更大些。 - 删除容器。可以使
docker rm 容器id
删除一个终止状态的容器。docker rm 容器id
若要删除一个运行中的容器,需要加-f参数
12.Docker公有仓库Docker Hub
- 仓库是集中存放镜像的地方。容易混淆的是注册服务器,它是管理仓库的服务器,每个服务器上可以有多个仓库,每个仓库下可以有多个镜像。因此仓库可以被认为是一个具体的目录。例如
dl.dockerpool.com/centos
来说,dl.dockerpool.com
是注册服务器地址,centos
是仓库名字。 - Docker官方目前维护着一个公共仓库,我们要是用这个仓库,需要登录https://hub.docker.com网址。注册一个账号。
- 在命令行中输入docker login 输入用户名密码完成登录。成功后,本地用户目录的.docker目录中将保留用户的认证信息。
- 在命令行我们可以通过docker search来查找官方仓库中的镜像,并可以使用docker pull命令将其下载到本地。
可以通过-s N指定查看多少星级以上的镜像,星级代表了该镜像的受欢迎程度docker pull hjd48/redhat
- 要推送镜像到Docker Hub,需要先登录账号,然后使用
docker push xxx
来推送
这个地方需要注意,镜像的名称必须要以自己Docker Hub上注册的用户名。要使用docker tag image_id new_tagname
;
我这个地方就是:docker tag 6fc131c6ae56 reganzm/sinatra:latest
修改好了之后就可以使用docker push reganzm/sinatra
将镜像推送到Docker Hub上面去了。
推送成功后,可以登录到自己的Docker Hub上面查看,如下:
13.创建Docker私有仓库
- 有时候,在公司内部为了提高分享的速度,需要在公司内部自己搭建一个本地的仓库,供私人使用。
- docker官方提供了一个工具docker-registry,我们可以借助这个工具构建私有镜像仓库
- a.首先,使用docker search命令查找registry
- b.
docker pull registry
- c.运行registry:
docker run -d -p 5000:5000 -v /root/docker/registry:/tmp/registry registry
默认情况下,仓库会创建在容器中的/tmp/registry目录下,通过-v 指定将镜像文件存放在本地的目录中。 - d.搭建好了私有仓库之后,就可以上传、下载、搜索镜像了。
查看本机ip:
查看本地已有的镜像:
将rarlinux标记为 192.168.0.5:5000/rarlinux;使用命令:
使用docker push上传标记的镜像docker tag 14a1b1556e64 192.168.0.5:5000/rarlinux
报错,解决方法是在/etc/docker目录下新建daemon.json,文件中写入:docker push 192.168.0.5:5000/rarlinux
然后重启docker :{ "insecure-registries":["192.168.0.5:5000"] }
systemctl restart docker
重新运行docker run -d -p 5000:5000 -v /root/docker/registry:/tmp/registry registry
,启动registry服务,再次运行docker push 192.168.0.5:5000/rarlinux
上传镜像到私有仓库。
接下来,我们可以到另一台机器192.168.0.8下载这个镜像了: