文章目录
- 一、docker容器
- 1、格式参数
- 2.创建容器
- 3、查看本机的容器列表
- 4、停止和启动一个容器
- 后台启动容器
- 5、删除容器
- 6、查看容器详细信息
- 7、复制命令
- 8、进入容器
- 9.退出容器
- 10、 查看日志
- 11.查看容器内部的进程信息
- 12.命令小结
- 13、搭建wordpress
一、docker容器
docker是一个进程隔离的软件,所运行的进程全部都运行系统之上
说明:
# 有镜像才可以创建容器,切记,切记
仓库:保存镜像的地方
镜像:启动容器的模板
容器:对外提供服务的实例
- 容器就是对外提供服务的一个实例(进程)
- 容器启动的必要条件:容器内至少有一个进程运行在前台
- 容器是基于镜像运行的,而镜像是放在仓库里的
#1.说明:我们有了镜像才可以创建容器,Linux,下载一个centos镜像来测试学习
[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
root@docter ~]# docker run -it centos bash
[root@a91d87bb9f12 /]# ping www.baidu.com
PING www.a.shifen.com (112.80.248.76) 56(84) bytes of data.
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=1 ttl=127 time=13.4 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=2 ttl=127 time=13.4 ms
# 如果ping不通 重启docker
# 如果docker启动不来,因为生命周期结束了,所以必须有一个进程运行在前台
1、格式参数
若要创建的容器仓库没有,则会自动从网上拉取,然后再创建(运行)
# 格式
docker run [参数] [镜像名称] [运行容器的启动命令]
# 参数
-d : 以守护进程的方式运行一个容器(后台运行)
docker run -d [镜像名称] [cmd]
--name : 指定容器的名称,将名称解析到 docker DNS上
docker run -d --name [容器名称] [镜像的名称] [cmd]
-q 显示容器编号(一般和aq一起用)
[root@docter ~]# docker ps -qa
c7c89b05bdd4
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25c51ba92edb nginx "/docker-entrypoint.…" 34 minutes ago Up 3 minutes 0.0.0.0:49154->80/tcp, :::49154->80/tcp serene_antonelli
[root@docter ~]# docker run -d --name nginx_restart nginx:latest
c3b74717e0d128359ed8851701cf97d01f77f448b4475cad253387298d2b1d28
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3b74717e0d1 nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 80/tcp nginx_restart
25c51ba92edb nginx "/docker-entrypoint.…" 35 minutes ago Up 4 minutes 0.0.0.0:49154->80/tcp, :::49154->80/tcp serene_antonelli
-p : 指定端口映射
-p 主机端口:容器端口 (常用)
# docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]
[root@docter ~]# docker run -d -p 30088:80 nginx
52185f79e20baa35e6c82f137bc99a4c4dbcdd6291d3770024908942038ab86e
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52185f79e20b nginx "/docker-entrypoint.…" 7 seconds ago Up 7 seconds 0.0.0.0:30088->80/tcp, :::30088->80/tcp wonderful_bell
c3b74717e0d1 nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 80/tcp nginx_restart
-P :随机端口映射(大P)
docker run -d -P [镜像名称] [cmd]
[root@docter ~]# docker run -d -P nginx
bcae495a2aa8c4bbd03ca86727091edf48258a9c9526abaced1b35325d8de08a
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bcae495a2aa8 nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:49155->80/tcp, :::49155->80/tcp zealous_einstein
52185f79e20b nginx
-i : 打开标准输出
-t : 创建一个伪终端
docker run -it [镜像名称] [cmd]
[root@docter ~]# docker run -it centos bash
[root@7a95e3976e59 /]# cd /etc/yum.repos.d/
[root@7a95e3976e59 yum.repos.d]# #执行命令
-rw-r--r-- 1 root root 719 Nov 10 2020 CentOS-Linux-AppStream.repo
-rw-r--r-- 1 root root 704 Nov 10 2020 CentOS-Linux-BaseOS.repo
-v : 挂载目录到容器中
docker run -v 宿主主机目录:容器内目录 [镜像名称] [cmd]
[root@docter ~]# docker run -v /opt/:/opt/ -it centos bash
[root@6e0ab67f4cc9 /]# cd /opt/
[root@6e0ab67f4cc9 opt]# ls -l
drwx--x--x 4 root root 28 Jun 19 11:51 containerd
[root@6e0ab67f4cc9 opt]# mkdir test
[root@6e0ab67f4cc9 opt]# ls -l
drwx--x--x 4 root root 28 Jun 19 11:51 containerd
drwxr-xr-x 2 root root 6 Jun 20 05:44 test
[root@6e0ab67f4cc9 opt]# exit
exit
[root@docter ~]# ll -l /opt/ #原来机器也有test
total 0
drwx--x--x 4 root root 28 Jun 19 19:51 containerd
drwxr-xr-x 2 root root 6 Jun 20 13:44 test
--rm : 容器生命周期结束时立即删除
docker run --rm [镜像名称] [cmd]
-m: 设置容器内存限制(默认:-1即不做任何限制)
-e : 在容器中创建一个环境变量
docker run -e NAME=Centos -d [镜像名称] [cmd]
[root@docter ~]# docker run -d -e NAME=CentOS -it centos
[root@docter ~]# printenv
NAME=Centos
--link : 连接上一个容器,实现网络互通
docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]
-h : 设置容器主机名
docker run -h "主机名" [镜像名称] [cmd]
-n=? #只显示最近创建的容器
[root@docter ~]# docker run -it -h "xxxx" centos bash
[root@docter ~]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7c89b05bdd4 centos:7 "bash" 4 minutes ago Exited (0) 2 minutes ago
[root@xxxx ~]# docker run -it -h "xxxx" centos bash
#补充
[root@docter ~]# yum -y install nginx
[root@docter ~]# cf6eab15fae2:/# nginx -g 'daemon off;' # nginx前台运行
2.创建容器
- 创建容器,类似于运行一个服务、进程
# 先查看当前仓库存在的镜像(镜像运行起来就叫容器)
[root@docter ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest d1a364dc548d 3 weeks ago 133MB
# 方式一:
1.创建一个仓库已有的容器(运行一个已有的镜像)
[root@docter ~]# docker run -d -P nginx
25c51ba92edb6a3e7665bd7d4e36306b0eb4efc4cb0a5262db58496f79f4b892
2.创建一个仓库没有的容器(运行一个不存在的镜像)# 会自动拉取(下载),再创建
[root@docter ~]# docker run -d mysql
[root@docter ~]# docker run -d -e MYSQL_ROOT_PASSWORD=123 mysql #设置密码
3.查看nginx服务
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25c51ba92edb nginx "/docker-entrypoint.…" 18 minutes ago Up 18 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp serene_antonelli
ae04df2e94c5 mysql "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 3306/tcp, 33060/tcp
方式二:
1、创建容器
[root@docter ~]# docker create tomcat bash 创建docker容器,但是不启动
Unable to find image 'tomcat:latest' locally
2、查看容器
[root@docter ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243344fd573f tomcat "bash" 16 seconds ago Created exciting_wu
74f6094f305e nginx "/docker-entrypoint.…" 18 hours ago Exited (255) 51 minutes ago 0.0.0.0:80->80/tcp, :::80->80/tcp intelligent_gagarin
3、启动容器
[root@docter ~]# docker start 243344fd573f
243344fd573f
# docker run运行流程
1、检查本地是否用指定镜像,如果没有则去对应的仓库下载镜像
2、启动容器,如果指定了命令则使用指定的命令,如果没有,则使用默认命令
3、返回容器ID
3、查看本机的容器列表
# 格式
docker ps [参数]
docker ps # 查看当前系统中正在运行的容器列表
#参数
-a : 查看系统中所有的容器。
-q : 仅显示容器的ID
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 容器ID #镜像ID或名称 #容器启动执行的命令 #创建时间 状态和时间 #端口 #容器名称
25c51ba92edb nginx "/docker-entrypoint.…" 22 minutes ago Up 22 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp serene_antonelli
# STATUS: 容器状态
up : 正在运行
Exit:退出(停止)状态
Created : 已创建状态
4、停止和启动一个容器
# 停止
docker stop [容器的ID|名称]
# 启动(该容器必须是系统创建的容器)
docker stop [容器的ID|名称]
[root@docter ~]# docker ps -a
25c51ba92edb nginx "/docker-entrypoint.…" 29 minutes ago Exited (0) 2 minutes ago serene_antonelli
[root@docter ~]# docker start serene_antonelli
serene_antonelli
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25c51ba92edb nginx "/docker-entrypoint.…" 30 minutes ago Up 4 seconds 0.0.0.0:49154->80/tcp, :::49154->80/tcp serene_antonelli
# 启动(该容器必须是系统已经存在的容器)
docker start [容器的ID|名称]
# 停止(该容器必须是系统已经存在的容器)
docker stop [容器的ID|名称]
# 重启
docker restart [容器的ID|名称]
#杀死
docker kill [容器的ID|名称]
#实例
[root@docker ~]# docker run -it centos #先运行一个容器
WARNING: IPv4 forwarding is disabled. Networking will not work.
[root@6f5810623fa2 /]# exit #退出并停止运行
exit
[root@docker ~]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
[root@docker ~]# docker ps -a #查看历史运行过的容器
7dad144d6066 nginx "/docker-entrypoint.…" 13 hours ago Exited (255) 44 minutes ago 0.0.0.0:49160->80/tcp, :::49160->80/tcp hopeful_black musing_borg
[root@docker ~]# docker start 6f5810623fa2 #开始centos容器
6f5810623fa2
[root@docker ~]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f5810623fa2 centos "/bin/bash" About a minute ago Up 12 seconds musing_borg
[root@docker ~]# docker stop 25c51ba92edb #停止centos容器
25c51ba92edb
[root@docker ~]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
系统已经存在的容器)
docker start [容器的ID|名称]
后台启动容器
# 命令 docker run -d 镜像名!
[root@docter ~]# docker run -d centos:7
# 问题docker ps,发现centos:7停止了
# 常见的坑: docker容器后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
5、删除容器
# 格式
docker rm [容器名称|ID]
# 参数
-f : 强制删除
docker rm -f [容器名称|ID]
# 清空容器
docker rm $(docker ps -a -q)
docker ps -a -q | xargs docker rm #linux命令
#实例
[root@docker ~]# docker rm 1714ae45e360 #删除正在运行容器会报错
Error response from daemon: You cannot remove a running container 6c42f137bd8c77b3e99608a43dfe12b52081dab5a844b784d608f062e6531e89. Stop the container before attempting removal or force remove
[root@docker ~]# docker rm -f 1714ae45e360 #强制删除
1714ae45e360
[root@docker ~]# docker ps -aq
922f3f7d4674
797e247019ad
[root@docker ~]# docker rm -f $(docker ps -aq) #删除所有容器
7dad144d6066
5994aa75479c
[root@docker ~]# docker ps -aq
6、查看容器详细信息
# 格式
docker inspect [容器名称|ID]
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
455378fd6fda centos:7 "bash" 18 minutes ago Up 16 minutes keen_einstein
[root@docter ~]# docker inspect 455378fd6fda
[
{
"Id": "455378fd6fda89c99f991fc28b619c0cfbe3a3868715ad58c7cc87303f32f438",
"Created": "2021-06-23T10:50:12.871257527Z",
"Path": "bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 8957,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-06-23T10:51:23.274272645Z",
"FinishedAt": "2021-06-23T10:51:01.453320873Z"
}
...
# 怎么监控docker运行状态?
docker inspect -f '{{.State.Running}}' nginx
7、复制命令
1、复制到容器内
docker cp [宿主主机文件路径] 容器ID:容器内路径
2、复制到容器外
docker cp 容器ID:容器内路径 [宿主主机文件路径]
#实例(从容器内拷贝文件到主机上)
[root@docker ~]# docker run -it centos /bin/bash #先运行一个容器
[root@94654381fb70 /]# cd /tmp #切换到家目录
[root@94654381fb70 tmp]# touch test.java #建一个文件
[root@94654381fb70 tmp]# ls
test.java
[root@94654381fb70 home]# exit #退出
exit
[root@docter ~]# docker ps -a #查看进程号
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf65bb1e44e3 nginx "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 80/tcp busy_solomon
6c42f137bd8c nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:49156->80/tcp, :::49156->80/tcp romantic_volhardago
[root@docker ~]# docker cp 94654381fb70:/tmp/test.java /tmp
#拷贝容器里那个文件到主机的家目录
[root@docker ~]# cd /tmp #切换到主机的家目录
[root@docker home]# ls #查看拷贝的文件
test.java
# 拷贝是一个手动拷贝, 未来我们使用 -V卷的技术,可以实现
8、进入容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置,进入容器一般有四种
1、exec : 在容器外向容器内执行一个命令(官方推荐)
docker exec [参数] [容器的ID] [cmd]
#实例:
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c42f137bd8c nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:49156->80/tcp, :::49156->80/tcp romantic_volhard
[root@docter ~]# docker exec 6c42f137bd8c ls /usr/share/nginx/html
50x.html
index.html
[root@docter ~]# docker exec -it romantic_volhard bash
root@6c42f137bd8c:/# ls -l /usr/share/nginx/html/
50x.html index.html
2、attach : 在早期docker提供的进入容器的命令(缺点:当其结束时,容器也跟着结束了)
docker attach [容器ID|名称]
#实例:
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c42f137bd8c nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:49156->80/tcp, :::49156->80/tcp romantic_volhard
[root@docker ~]# docker attach 6c42f137bd8c
[root@6c42f137bd8c /]#
3、nsenter : 建立一个管道连接上容器主ID
nsenter --target $( docker inspect -f {{.State.Pid}} 30d369d70bcd) --mount --uts --ipc --net --pid
4、ssh : 通过ssh连接
===================================================================================
# 进入容器的区别:
- exec :进入容器后开启一个新的终端,可以在里面操作(常用)
- attach :进入容器正在执行的终端,不会启动新的进程(连接PID=1的进程)
9.退出容器
1.ctrl + PQ # 保持容器运行的情况下退出:
# ctrl +P +Q 三键退出
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8385339b6977 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp vibrant_chebyshev
2.exit # 直接退出
[root@docker ~]# docker run -it centos
[root@d2b5de710d3f /]# exit
exit
[root@docker ~]# docker ps | grep centos
3.再次进入则需要指定-it打开窗口,跟上bash
[root@docker ~]# docker exec -it f36ca3a2d063 bash
root@f36ca3a2d063:/#
10、 查看日志
#1.本身容器没有日志
docker logs -f -t --tail [容器ID/容器名称]
#2.运行一个程序(编写一个脚本)
docker run -d centos:7 /bin/bash -c "while true; do echo 123;sleep 1;done"
-c:指定动作 #小写c
-tf:显示日志
--tail number: 显示日志条数
#3.查看运行的容器
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8385339b6977 nginx "/docker-entrypoint.…" 33 minutes ago Up 33 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp vibrant_chebyshev
#4.显示日志
[root@docter ~]# docker logs -tf --tail 10 8385339b6977 #显示10条日志内容
2021-06-20T08:57:02.425892759Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
2021-06-20T08:57:02.427379880Z /docker-entrypoint.sh: Configuration complete; ready for start up
2021-06-20T08:57:02.450708718Z 2021/06/20 08:57:02 [notice] 1#1: using the "epoll" event method
2021-06-20T08:57:02.450724015Z 2021/06/20 08:57:02 [notice] 1#1: nginx/1.21.0
docker logs -tf --tail 10 73f41ee70158
11.查看容器内部的进程信息
#1.查看容器内部的进程信息(容器必须是运行的,必须用容器ID查看)
[root@docter ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
455378fd6fda centos:7 "bash" 14 minutes ago Up 13 minutes keen_einstein
[root@docter ~]# docker top 455378fd6fda
UID PID PPID C STIME TTY TIME CMD
root 8957 8933 0 18:51 pts/0 00:00:00 bash
12.命令小结
13、搭建wordpress
# 1、docker run -d -e MYSQL_ROOT_PASSWORD=123 --name mysql mysql:5.7
# 2、docker run -d -it --link mysql:mysql -v /root/wd:/usr/share/nginx/html --name php alvinos/php:discuz-v2
# 3、docker run -d -P -v /root/wd:/usr/share/nginx/html --name nginx --link php:php nginx