linux12 - docker容器化 -->容器的相关命令

Posted FikL-09-19

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux12 - docker容器化 -->容器的相关命令相关的知识,希望对你有一定的参考价值。

一、docker容器

仓库:保存镜像的地方

镜像:启动容器的模板

容器:对外提供服务的实例

  • 容器就是对外提供服务的一个实例(进程)
  • 容器启动的必要条件:容器内至少有一个进程运行在前台
  • 容器是基于镜像运行的,而镜像是放在仓库里的

(C:\\Users\\17155\\Desktop\\docker img\\1623940154960.png)]在这里插入图片描述

#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 
[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]
		
[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 : 指定端口映射
		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 
[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 
[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]
	
	-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]
[root@docter ~]# docker run -it -h "xxxx" centos 
[root@xxxx ~]# docker run -it -h "xxxx" centos 
#补充
[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
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
69692152171a: Already exists 
1651b0be3df3: Already exists 
951da7386bc8: Already exists 
0f86c95aa242: Already exists 
37ba2d8bd4fe: Already exists 
6d278bb05e94: Already exists 
497efbd93a3e: Already exists 
f7fddf10c2c2: Already exists 
16415d159dfb: Already exists 
0e530ffc6b73: Already exists 
b0a4a1a77178: Already exists 
cd90f92aa9ef: Already exists 
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Status: Downloaded newer image for mysql:latest
b47f6ff7af6dd1a925e50cc1be20958804f89288917d5ef9cc7b5d0659d54221

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

# 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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KTATAOFz-1624197443934)(C:\\Users\\17155\\Desktop\\docker img\\1616137673048.png)]

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  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/"   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|名称]

5、删除容器

# 格式
	docker rm [容器名称|ID]

# 参数
	-f : 强制删除
	docker rm -f [容器名称|ID]

# 清空容器
docker rm $(docker ps -a -q)
docker ps -a -q | xargs docker rm 

#实例
[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]

# 怎么监控docker运行状态?
docker inspect -f '{{.State.Running}}' nginx

7、复制命令

1、复制到容器内
	docker cp [宿主主机文件路径]  容器ID:容器内路径

2、复制到容器外
	docker cp 容器ID:容器内路径 [宿主主机文件路径]

#实例(从容器内拷贝文件到主机上)
[root@docker ~]# docker run -it centos /bin/  #先运行一个容器
WARNING: IPv4 forwarding is disabled. Networking will not work.
[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

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 
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	# 保持容器运行的情况下退出:
[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打开窗口,跟上
[root@docker ~]# docker exec -it f36ca3a2d063 
root@f36ca3a2d063:/# 


10、 查看日志

#1.本身容器没有日志
docker logs -f -t --tail [容器ID/容器名称]

#2.运行一个程序(编写一个脚本)
docker run -d centos /bin/ -c "while true; do echo 123;sleep 1;done"
-c:指定动作

#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 top 8385339b6977
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7497                7474                0                   16:57               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 7552                7497                0                   16:57               ?                   00:00:00            nginx: worker process
101                 7553                7497                0                   16:57               ?                   00:00:00            nginx: worker process

以上是关于linux12 - docker容器化 -->容器的相关命令的主要内容,如果未能解决你的问题,请参考以下文章

linux12 - docker容器化 -->Docker-day3-四种网络模式

Linux 容器化技术详解(虚拟化容器化Docker)

容器化工具--------Docker的网络操作

容器化工具--------Docker的网络操作

容器化开发_02_Docker判断程序是否起来?Docker定位容器错误?

容器化开发_02_Docker判断程序是否起来?Docker定位容器错误?