Docker基本的容器操作

Docker基本的容器操作

容器是docker的另一个核心概念。简单说,容器是镜像的一个运行实例,是独立运行的一个或者一组应用以及他们所必须的运行环境,包括文件系统、系统类库、shell环境等。镜像是只读模板,而容器会给这个只读模板添加一个额外的可写层

容器的创建

命令格式:docker create [选项] 镜像 运行的程序

# 常用选项
-i:让容器的输入保持打开
-t:让docker分配一个伪终端
--name:指定容器的名称,如果不加的话容器名称是随机生成的
[root@docker-01 ~]# docker create -it --name myname nginx:latest bash
3cbd2bbf3cb0dddc7c8edd8730723d491606509587e7b6811a951dff16197262
​
# 使用docker create命令创建新的容器后会返回一个唯一的ID。可以使用docker ps命令查看所有容器的运行状态。添加-a选项可以显示所有的容器。包括为运行的
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS    PORTS     NAMES
3cbd2bbf3cb0   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Created             myname
​
# 回显含义如下
CONTAINER ID:容器的ID
IMAGE:加载的镜像
COMMAND:运行的程序
CREATED:创建容器的时间
STATUS:目前容器所处的状态
PORTS:端口映射
NAMES:容器的名称

容器的启动、停止、创建并启动容器

启动容器

命令格式:docker start 容器名称

[root@docker-01 ~]# docker start myname
myname
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS          PORTS     NAMES
3cbd2bbf3cb0   nginx:latest   "/docker-entrypoint.…"   6 minutes ago   Up 11 seconds   80/tcp    myname
​
# 启动容器后,STATUS状态变成了UP状态,表示容器已经处于启动状态

停止容器

命令格式:docker stop 容器的名称/ID

[root@docker-01 ~]# docker stop myname
myname
[root@docker-01 ~]# docker ps -a
3cbd2bbf3cb0   nginx:latest      "/docker-entrypoint.…"   33 minutes ago   Exited (137) 22 seconds ago                                             myname

创建并启动容器

容器是一个与其中运行的shell命令共存亡的终端,命令运行容器运行,命令结束容器退出

命令格式:docker run

# 当利用docker run来创建容器时,docker在后台的标准运行过程是
1.检查本地是否存在指定的镜像。当镜像不存在时,会从公共仓库下载
2.利用镜像创建并启动一个容器
3.分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层
4.从宿主机主机配置的往前接口中桥接一个虚拟机接口到容器中
5.分配一个地址池中的IP地址给容器
6.指定用户指定的应用程序,指定完毕后容器被终止运行
​
# 例如:创建容器并启动执行一条shell命令
[root@docker-01 ~]# docker run centos:7.6.1810 bash -c ls /
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 执行一下命令可以看出容器在执行"/usr/bin/bash -c ls"命令之后就停止了,有时候需要在后台持续的运行这个容器,就需要让docker容器以守护形式在后台运行。可以在docker run 命令之后添加-d选项来实现。但是需要注意容器所运行的程序不能结束,容器执行的命令一旦借宿那么容器也就推出了
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                      PORTS     NAMES
6a3739391e27   centos:7.6.1810   "bash -c ls /"           30 seconds ago   Exited (0) 28 seconds ago             mystifying_euler
3cbd2bbf3cb0   nginx:latest      "/docker-entrypoint.…"   15 minutes ago   Up 10 minutes               80/tcp    myname
​
​
​
​
# 例如:下面的容器会在后台运行30秒后终止
[root@docker-01 ~]# docker run -itd centos:7.6.1810 bash -c "sleep 30"
1d414b78bbe5ba48b466dba497f7b9645d45f302c946fda7376be18c96f562ef
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                     PORTS     NAMES
1d414b78bbe5   centos:7.6.1810   "bash -c 'sleep 30'"     13 seconds ago   Up 12 seconds                        clever_haibt
​
​
​
# 例如:下面的容器会一直运行
[root@docker-01 ~]# docker run -itd centos:7.6.1810 bash -c "while true;do echo hello;done"
88b7043a5b75ad0f3ce1ed60f591a52a79c4ce4f4fe97f30fa23b7ebc498bec2
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                          PORTS     NAMES
88b7043a5b75   centos:7.6.1810   "bash -c 'while true…"   11 seconds ago   Up 10 seconds                             hopeful_black
​
​
​
# 创建容器的时候可以根据需求添加一些选项,常用的选项有
--rm:容器退出时自动删除容器
--name:指定容器的名字
-p:8080:80将宿主机的8080端口映射到容器的80端口(也就意味着如果访问虚拟机的8080端口就相当于访问容器的80端口)
-P:随机映射端口号
[root@docker-01 ~]# docker run -d --rm --name mynginx -P nginx:latest
f0e99cfa10c1ae1c77bb6600ea5945583d24c89393d24f6ac05523d146118a81
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                       PORTS                                     NAMES
f0e99cfa10c1   nginx:latest      "/docker-entrypoint.…"   17 seconds ago   Up 16 seconds                0.0.0.0:32768->80/tcp, :::32768->80/tcp   mynginx
​
​
[root@docker-01 ~]# docker run -d --rm --name myningx_01 -p 8080:80 nginx:latest
d135e4786cff67951cfea1666424b91f29298ad53b7e92efa42560ce1e88a2f5
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS                       PORTS                                     NAMES
d135e4786cff   nginx:latest      "/docker-entrypoint.…"   10 seconds ago       Up 9 seconds                 0.0.0.0:8080->80/tcp, :::8080->80/tcp     myningx_01
​
​
​
# 查看容器端口转发情况
[root@docker-01 ~]# docker port a07b19ffc4b1
80/tcp -> 0.0.0.0:85
80/tcp -> [::]:85
​
​

进入容器

命令格式:docker exec -it 容器ID/名称 /bin/bash

[root@docker-01 ~]# docker exec -it mynginx /bin/bash
# 执行exit可以退出容器
root@f0e99cfa10c1:/# exit
exit

导出容器和导入容器

用户可以将任何一个docker容器从一台机器迁移到另一台机器。在迁移的过程中,可以使用docker export民两个将已经创建好的容器导出为文件,无论这个容器是否处于运行状态还是停止状态均可导出

导出容器

命令格式:docker export 容器ID/名称 > 文件名

# 导出mynginx容器到文件mynginx.tar
[root@docker-01 ~]# docker export mynginx > mynginx.tar
[root@docker-01 ~]# ls -lh mynginx.tar 
-rw-r--r-- 1 root root 182M May 10 22:26 mynginx.tar

导入容器

命令格式:cat 文件名 | docker import -生成的镜像名称:标签

# 可以直接scp把刚刚导出的容器镜像上传到其他机器上验证效果
[root@docker-02 ~]# cat mynginx.tar | docker import - mynginx:1.0
sha256:dc71be6ceabdf4508ef245c3b5bf750f7d135a0ce15c1574c842c3606c4a0e2f
[root@docker-02 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mynginx      1.0       dc71be6ceabd   3 seconds ago   186MB

删除容器

命令格式: docker rm 容器ID/名称

[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
e57cb74fc0e2   nginx:latest   "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   80/tcp    myname
[root@docker-01 ~]# docker rm myname
myname
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Docker 的数据管理

在docker中,为了方便查看容器内产生的数据或者共享多个容器之间的数据,就涉及到容器的数据管理操作。管理docker容器中数据主要有两种方式:数据卷和数据卷容器

数据卷概述

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻就在相对用的容器挂载目录中显示,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行mount操作

创建数据卷

在docker run命令中使用-v选项可以在容器内创建数据卷。多次使用-v可创建多个数据卷。使用–name选项可以给容器创建一个友好的自定义名称

# 例如:使用nginx:latest镜像创建一个名为web的容器,并且创建两个数据卷分别挂载到/data1和/data2目录上
[root@docker-01 ~]# docker run -d -v /data1 -v /data2 --name web nginx:latest8aa51caf3fa61d260a6fb22766fe02e1f7e6bbefa07feb80592df567ef34b3ea
[root@docker-01 ~]# docker exec -it web bash
root@8aa51caf3fa6:/# ls -l
drwxr-xr-x   2 root root    6 May 11 03:20 data1
drwxr-xr-x   2 root root    6 May 11 03:20 data2

挂载主机目录作为数据卷

使用docker run命令的-v选项可以在创建数据卷的同时,将宿主机的目录挂载到数据卷上使用,以实现宿主机于容器之间的数据迁移。注意:宿主机本地目录的路径您必须是使用的绝对路径。如果路径不存在,docker会自动创建相对应的路径

# 例如:使用nginx:latest镜像创建一个名为web-1容器,并且将宿主机的/var/www目录挂载到容器的/data1目录上
[root@docker-01 ~]# docker run -d -v /var/www/:/data1 --name web-1 nginx:latest
fad85d0b53956f198a560075adf9615b6d8f95aed8ed8cd233917f905aadf0bd
[root@docker-01 ~]# touch /var/www/test.html
[root@docker-01 ~]# docker exec -it web-1 bash
root@fad85d0b5395:/# ls /data1/
test.html

数据卷容器

如果需要在容器之间共享一些数据,最简单的方式就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。使用方法如下:需要创建一个容器作为数据卷容器,之后在其他容器创建时使用–volumes-from挂载数据卷容器中的数据卷使用

# 例如:使用前面预先创建好的数据卷容器web。其中所创建的数据卷分别挂载到/data1与/data2目录上,使用--volumes-from来挂载web容器中的数据卷到新的容器,新的容器名为db1
[root@docker-01 ~]# docker run -it --volumes-from web --name db1 nginx:latest bash
root@42e73d8ccca5:/# touch /data1/hello.txt
root@42e73d8ccca5:/# exit
exit
d[root@docker-01 ~]# docker exec -it web bash
root@8aa51caf3fa6:/# ls /data1
hello.txt

查看容器的日志和详细信息

查看容器日志

# 将容器旧日志打到屏幕上
[root@docker-01 ~]# docker logs 8567f02c60b6


# 实时查看容器日志
[root@docker-01 ~]# docker logs -f 8567f02c60b6


# 结合管道符查看后10行容器日志
[root@docker-01 ~]# docker logs 8567f02c60b6 | tail -10

查看容器的详细信息

# 查看容器详细信息,用于高级的调试
[root@docker-01 ~]# docker container inspect 8567f02c60b6

容器的提交

# 提交的容器当中已经是提前安装好了vim编辑器的容器,把它提交为yuchao163/centos-vim-7.8.2003镜像,当用这个镜像创建新的容器时,将自带vim编辑器
[root@docker-01 ~]# docker commit 5de8a1c1f640 yuchao163/centos-vim-7.8.2003

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值