操作docker容器

本章将具体介绍如何来管理一个容器,包括创建、启动和停止等:

启动容器:

两种方式:一种基于镜像新建一个容器启动,一种是将在终止状态的容器重新启动。

新建并启动:

所需要的命令主要为 docker run 。
例如,下面的命令输出一个 “Hello World”,之后终止容器。
$ docker run ubuntu:18.04 /bin/echo 'Hello world'
Hello world

启动已终止容器
可以利用 docker container start 命令,直接将一个已经终止的容器启动运行。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps 或 top 来查看进程信息。
root@ba267838cc1b:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率
极高,是货真价实的轻量级虚拟化。

后台运行:容器会把输出的结果 (STDOUT) 打印到宿主机上面
如果使用了 -d 参数运行容器。
$ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)。

要获取容器的输出信息,可以通过 docker container logs 命令。
$ docker container logs [container ID or NAMES]
hello world
hello world
hello world

终止容器
可以使用 docker container stop 来终止一个运行中的容器。此外,当 Docker 容器中指定的应用终结时,容器也自动终止。
例如对于上一章节中只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d来退出终端时,所创建的容器立刻终止。

 

导出和导入容器:

导出容器:docker export 命令。

如果要导出本地某个容器,可以使用 docker export 命令。
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:18.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ docker export 7691a814370e > ubuntu.tar   这样将导出容器快照到本地文件

导入容器快照:docker import 命令

从容器快照文件中再导入为镜像,例如
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
此外,也可以通过指定 URL 或者某个目录来导入,例如
$ docker import http://example.com/exampleimage.tgz example/imag

删除容器:docker container rm删除一个处于终止状态的容器。例如:

docker container rm 

清理所有处于终止状态的容器:   docker container prune

 

数据卷:

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除

创建一个数据卷:docker volume create my-vol

查看所有的 数据卷:docker volume ls

在主机里使用以下命令可以查看指定 数据卷 的信息:

docker volume inspect my-vol 

启动一个挂载数据卷的容器
在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷 。
下面创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /webapp 目录。
$ docker run -d -P \
--name web \
# -v my-vol:/wepapp \
--mount source=my-vol,target=/webapp \
training/webapp \
python app.py

查看数据卷的具体信息:docker inspect web 

删除数据卷:  docker volume rm my-vo1 

数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷 ,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。无主的数据卷可能会占据很多空间,要清理请使用以下命令
$ docker volume prune
 

挂在主机目录:

使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount 参数时如果本地目录不存在,Docker 会报错。

Docker 挂载主机目录的默认权限是 读写 ,用户也可以通过增加 readonly 指定为 只读 。

$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了 readonly 之后,就挂载为 只读 了。如果你在容器内 /opt/webapp 目
录新建文件,会显示如下错误:/opt/webapp # touch new.txt   touch: new.txt: Read-only file system

查看数据卷的具体信息
在主机里使用以下命令可以查看 web 容器的信息
$ docker inspect web
挂载主机目录 的配置信息在 "Mounts" Key 下面
"Mounts": [
{
"Type": "bind",
"Source": "/src/webapp",
"Destination": "/opt/webapp",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

 

挂载一个本地主机文件作为数据卷
--mount 标记也可以从主机挂载单个文件到容器中
$ docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:18.04 \
bash
root@2affd44b4667:/# history
1 ls
2 diskutil list
这样就可以记录在容器输入过的命令了。

 

docker中的网络功能:重点。Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。

外部访问:

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或-p 参数来指定端口映射。
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
使用 docker container ls 可以看到,本地主机的 49155 被映射到了容器的5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。
$ docker run -d -P training/webapp python app.py
$ docker container ls -l
CONTAINER ID IMAGE COMMAND  CREATED  PORTS  NAMES
bc533791f3f5 training/webapp:latest  python  app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
同样的,可以通过 docker logs 命令来查看应用的信息。
$ docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1"
404 -
-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。
支持的格式有 ip:hostPort:containerPort | ip::containerPort |hostPort:containerPort 。

映射到指定地址的任意端口
使用 ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以使用 udp 标记来指定 udp 端口
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

查看映射端口配置:

使用docker port 来查看当前映射的端口配置,也可以查看到绑定的地址。:docker port nostalgic_morse 5000 

注意:容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
-p 标记可以多次使用来绑定多个端口
例如
$ docker run -d \
-p 5000:5000 \
-p 3000:80 \
training/webapp \
python app.py

容器互联:如果你之前有docker使用经验。你习惯了使用。--link 参数来使容器互联。

随着docker网络的完善,强烈建议大家将容器加入自定义的docker网络来连接多个容器,而不是使--link参数。

新建网络:下面创建一个新的docker网络。

docker network create -d birdge my-net

-d 参数指定docker网络类型,有birdge overlay 

连接容器:运行一个容器并连接到新建的my-net 网络:如下:

docker run -it --rm --name busybox1 --network my-net busybox sh   

打开一个新的终端,再运行一个容器并加入到my-net网络:

docker run -it --rm --name busybox2 --network my-net busybox sh

docker container ls   查看终端信息。

 

docker compose  多个容器之间相互连接推荐使用。

配置dns:docker利用虚拟文件来挂载容器的3个相关配置文件。

在容器中使用mount 命令可以看到挂载信息:

这种机制可以让宿主主机DNS发生信息更新后,所有的docker的DNS配置通过/etc/resolv.conf 文件立刻得到更新。

配置容器的DNS,也可以在/etc/docker/daemon.json  文件中增加以下内容来设置。

{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}

这样每次启动容器DNS自动配置为:114.114.114.114  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值