第四章 Docker容器的使用

一、容器的创建

容器是指Docker对外提供服务的一个实例。

#1.创建容器的格式:
docker  run  [option]  image  [cmd]

#2.示例
[root@m01 ~]# docker run -d --name nginx -p 80:80 nginx
87594f40bacdc4f94bee5186740a3eae9c179634a58cf7c77b4e16ef984d24e4

二、容器启动参数

-d 以守护进程方式运行
-p 指定映射端口
-P 随机映射端口
-i 保持标准输入打开
-t 分配一个伪终端
-v 设置挂载文件到主机上
--rm 当容器关闭时自动删除
--name 为启动的容器设置一个名字
--network 指定使用哪个网络
-e 设置容器中的环境变量
--link 链接到另一个容器
-h 指定容器内的主机名
注意--link 是单方向的  比如 zabbix容器链接MySQL zabbix就必须指定 MySQL容器的名字  也就是说 你启动MySQL的时候 最好给容器名字 

1.格式

docker run [参数] [镜像名称|ID] [指定的容器运行命令(如果不设置则使用默认命令)]

2.容器启动流程

1、执行一个docker run
2、检查本地是否存在所需镜像,如果没有则去远程镜像仓库下载。
3、按照镜像和参数启动一个容器

3.示例

#1.-d : 只以守护进程的模式运行一个容器
[root@docker100 ~]# docker run -d nginx
aeda72468e4eef99bc648c4f05166d8282c21977afb6d80445c77f612dd6c65b

#2.-i:打开标准输出,-t:创建一个窗口(伪终端)
[root@docker100 ~]# docker exec -it aeda72468e4e bash
root@aeda72468e4e:/# 

#3.-p(小写的p字母):指定映射端口
[root@m01 ~]# docker run -d -p 30080:80 nginx;docker ps

#3.-P(大写的P字母) : 随机映射端口
[root@docker100 ~]# docker run  -d -P nginx
9ee77ffb1e5d1a6b37b689b8e030560652c70af20153f0d537ded89a97e3ecef
[root@docker100 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
9ee77ffb1e5d   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp   naughty_ishizaka

#4.-v : 指定挂载卷(将本机的目录映射到容器内部)
作用:
	1、将本机目录"软链接"容器内部
	2、可以持久化容器内部数据
示例:
	[root@m01 ~]# docker run -d -P -v /root/test:/usr/share/nginx/html nginx:latest

#5.--name : 指定容器的名称
作用:
	1、指定容器名称
	2、将名称解析到docker dns上
示例:
	[root@m01 ~]# docker run -d --name nginx nginx

#6.--link : 将一个容器的网络连接到另外一个容器
格式:
	--link 容器名称:连接别名
	
示例:
	[root@m01 ~]# docker run -d --name test_nginx  nginx
	[root@m01 ~]# docker run -it --link test_nginx:test_nginx centos

#7.--rm : 当容器的生命周期结束时,自动删除容器
示例:
	[root@m01 ~]# docker run -d --rm centos sleep 10
	
#8.--network : 连接网桥(同一个网桥内的所有容器网络互通)
示例:
	[root@m01 ~]# docker network create chenyang
	[root@m01 ~]# docker run -d --network chenyang nginx

三、停止容器

docker终止容器是首先向容器发送SIGTERM信号,等待一段时间超时后(默认10秒),再发送SIGKILL信号来终止容器。
停止容器,并没有删除容器。

1.查看容器进程数

#1.查看启动的容器进程数
[root@m01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                   NAMES
87594f40bacd   nginx     "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes       0.0.0.0:80->80/tcp      nginx
1e54552dfbde   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49153->80/tcp   wizardly_carson

参数:
-a : 查询本机上所有的容器(包括已经停止了的)
-q : 只显示容器ID

列表参数:
    CONTAINER ID:容器ID
    IMAGE       :镜像ID
    COMMAND     :启动容器运行的命令      
    CREATED     :容器创建的时间
    STATUS      :状态(Up:启动状态  Exitd:停止状态)
    PORTS       :端口映射
    NAMES		:容器名称

2.停止nginx容器

#1.格式:
	docker stop [容器ID及名称]
#2.示例:
[root@m01 ~]# docker stop nginx
nginx

3.再次查看容器进程数

#3.再次查看容器进程数
[root@m01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                   NAMES
1e54552dfbde   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49153->80/tcp   wizardly_carson

可见,NGINX容器已经被我们终止了,这个时候我们也可以重新启动这个容器。

4.启动nginx容器

#1.格式:
	docker start [容器ID及名称]
#2.示例:
[root@m01 ~]# docker start nginx
nginx
[root@m01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                   NAMES
87594f40bacd   nginx     "/docker-entrypoint.…"   6 minutes ago       Up 7 seconds       0.0.0.0:80->80/tcp      nginx

四、进入容器

在使用容器的过程中,我们难免需要进入容器进行排查问题。下面我们就来介绍进入容器的集中方式。

1.attach

attach是最早docker官方推出的进入容器的命令了,不过使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗口退出时,容器结束。

#1.解释:
		进入容器。通过一个管道连接到容器的顶级进程。
		缺点:当attach退出是,顺带把顶级进程也带走了。
#2.格式:
		docker attach [容器ID或名称]
#3.示例:
[root@m01 ~]# docker attach  nginx
10.0.0.61 - - [11/Jan/2021:13:03:55 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

2. exec(推荐)

既attach之后,exec是官方推出的有一个新的进入容器的命令,这个命令相当于在容器中执行一个命令。

#1.解释:
	exec不是进入容器的命令,而是碰巧有这种功能。其功能是在容器外向容器内执行一条命令的命令。
#2.格式:
	docker exec [参数] [容器的ID或名称] [命令]
#3.示例:
[root@docker ~]# docker exec -i -t ead6cdefcd01 bash
root@ead6cdefcd01:/#
[root@m01 ~]# docker exec -it nginx /bin/bash
root@87594f40bacd:/#

3.nsenter

需要配合docker inspect来使用(早期没有exec命令时,企业当中最长用的方式之一),Docker是用golang语言开发,所以它也支持go语言的摸版语法。

#1.解释:
		建立两个进程之间的互通管道
#2.格式:
		nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
#3.示例:
[root@m01 ~]# nsenter --target $( docker inspect -f {{.State.Pid}} nginx ) --mount --uts --ipc --net --pid
mesg: ttyname failed: No such device
root@87594f40bacd:/# 
root@87594f40bacd:/# 

4. ssh

在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容器内。

#1.解释:
		通过ssh隧道连接
#2.格式:
		ssh root@x.x.x.x

5.总结·

进入docker container中一般情况下有4种方式,最常用的是exec和nsenter这两种。

Nsenter和exec之间的区别?
1)Exec是docker自带的命令,Nsenter是Linux提供的命令。
2)Exec相当于在容器内执行一个命令,而Nsenter是仅仅进入容器之中而已。

五、删除容器

可以使用 docker rm 命令来删除处于终止或退出状态的容器.
命令格式为:
docker rm  container。

[root@m01 ~]# docker rm nginx

# 强制删除一个正在运行的容器。
[root@m01 ~]# docker rm -f nginx
nginx

# 强制删除所有的容器。
[root@m01 /docker]# docker container rm $(docker container ls -aq) -f

六、导入与导出容器

某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导人和导出功能,这也是 Docker 自身提供的一个重要特性。

1. 导出容器

导出的文件又可以使用 docker [ container] import 命令导人变成镜像,该命令格式为:

[root@m01 ~]# docker import nginx.tar test/nginx:v1
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b

[root@m01 ~]# docker images | grep test
test/nginx                             v1             02107323de1b    22 seconds ago   131MB

实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使docker [container] import 命令来导入一个容器快照到本地镜像库 这两者的区别在于 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大 此外,从容器快照文件导人时可以重新指定标签等元数据信息。

七、 查看容器

查看容器详情可以使用 docker container inspect [OPTIONS] CONTAINER [CONTAINER . .. ]子命令。

#1.格式:
	docker inspect [容器ID或名称]

#2.示例:
[root@m01 ~]# docker inspect 22b601ab6f9f
[
    {
        "Id": "22b601ab6f9f7010221440f1158e0ece348768e4df1b133690f1c503ed012e4d",
        "Created": "2021-01-12T09:29:07.881750107Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
...

#3.参数:
-f : 指定使用golang语言模板	
[root@m01 ~]# docker inspect -f '{{ .State.Status }}' d4b2a919cb7f
running

八、容器复制命令详解

复制命令类似于Linux系统中的scp命令,是将宿主主机上的内容上传到容器中,也可能是将容器中的文件下载到宿主主机中。

#1.格式:
	第一种:复制到容器内
		docker cp [宿主主机的路径] [容器ID]:[容器内的路径]
		
	第二种:复制到容器外
		docker cp [容器ID]:[容器内的路径] [宿主主机的路径]

#2.示例:
$将宿主主机中的文件复制到容器中
[root@m01 ~]# docker cp start 726b695a337c:/root
[root@m01 ~]# docker exec 726b695a337c ls /root
start

$将容器中的内容复制到宿主主机
[root@m01 ~]# docker cp 726b695a337c:/opt/start .
[root@m01 ~]# ls | grep start
Start

posted @ 2022-09-21 16:23  高压锅炖主播  阅读(99)  评论(0编辑  收藏  举报