一、容器的创建
容器是指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