Docker容器操作

启动容器

所需要的命令主要为 docker run。例如,下面的命令输出一个 “Hello World”,之后终止容器。

docker run ubuntu:16.04 /bin/echo 'Hello world'
Hello world

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

终止容器

可以使用 docker container stop 来终止一个运行中的容器。此外,当 Docker 容器中指定的应用终结时,容器也自动终止。

docker stop [container ID or NAMES]
#类同
docker container stop [container ID or NAMES]

例如对于只启动了一个终端的容器,用户通过 exit 命令或 ctrl + d 来退出终端时,所创建的容器立刻终止。终止状态的容器可以用 docker container ls -a命令看到。例如

#查看正在运行的容器
docker ps
#查看所有容器
docker ps -a
#查看最后一次运行的容器
docker ps –l
#查看停止的容器
docker ps -f status=exited

#类同
docker container ls -a
# 输出如下
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                          PORTS               NAMES
ba267838cc1b        ubuntu:14.04             "/bin/bash"            30 minutes ago      Exited (0) About a minute ago                       trusting_newton
98e5efa7d997        training/webapp:latest   "python app.py"        About an hour ago   Exited (0) 34 minutes ago                           backstabbing_pike

启动已终止容器

处于终止状态的容器,可以通过 docker container start 命令来重新启动。此外,docker container restart 命令会将一个运行态的容器终止,然后再重新启动它。

docker start [container ID or NAMES]
#类同
docker container start [container ID or NAMES]

守护态运行

更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。如果不使用 -d 参数运行容器。

docker run ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 输出如下
hello world
hello world
hello world
hello world

容器会把输出的结果 (STDOUT) 打印到宿主机上面,如果使用了 -d 参数运行容器。

docker run -d ubuntu:17.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 输出如下
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)。

注意: 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。

容器日志

要获取容器的输出信息,可以通过 docker container logs 命令。

docker logs [container ID or NAMES]
#类同
docker container logs [container ID or NAMES]
# 输出如下
hello world
hello world
hello world

进入容器

在使用 -d 参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,docker exec 命令能让我们以交互的方式进入容器。

docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数。只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。

#/bin/bash必须带 exit 命令或 ctrl + d 来退出终端
docker exec -it 容器名称 (或者容器ID)  /bin/bash   
#或者
docker exec -it 容器名称 (或者容器ID) bash

如果从这个 stdin 中 exit,不会导致容器的停止。更多参数说明请使用 docker exec --help 查看。

删除容器

可以使用 docker container rm 来删除一个处于终止状态的容器。例如

docker rm trusting_newton
#类同
docker container rm trusting_newton
trusting_newton

如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

清理所有处于终止状态的容器

用 docker container ls -a 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。

docker container prune

 

扩展参数说明

docker run说明

-i:表示运行容器

-t:-it 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

--name :为创建的容器命名。

-v:表示目录映射关系(前者是主机目录,后者是镜像目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

主要用于日志、数据库等持久化存储。
我们IOT项目遵循OSGI规范、实现动态加载jar包,可能需要通过目录映射来实现。

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

--net=host:表示容器与宿主机共用网络

--link 创建应用时 可以指定link name 让应用访问指定的容器(不推荐)

network create 创建容器内部网络

--network 命令可以指定容器运行的网络,通过将多个容器指定到同一个网络可以让容器间相互访问。

--rm:在程序执行完,退出后删除容器

-I:大写,程序 crash 自动重启

-n :启动进程数

-t:-n 2 -t 2 单进程所占用 CPU 核数 与-n 配对出现

--restart=always:表示自动重启 no - 容器退出时,不重启容器;

on-failure - 只有在非0状态退出时才从新启动容器;--restart=on-failure:10 redis 重启最大次数10次

always - 无论退出状态是如何,都重启容器;

交互式创建容器

#/bin/bash可以不带 直接进入容器终端
docker run -it --name=容器名称 镜像名称:标签 /bin/bash      

修改容器

#修改容器自动重启
docker update --restart=always 容器名称  

文件拷贝

#如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
#也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录

目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。 创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
#创建目录
mkdir /usr/local/myhtml
#创建文件 文件没有查看下共享目录是否正确
touch index.html

如果你共享的是多级的目录,可能会出现权限不足的提示。

这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题

查看容器IP地址

我们可以通过以下命令查看容器运行的各种数据

docker inspect 容器名称(容器ID) 

也可以直接执行下面的命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值