Docker容器的基本操作

Posted 王大雏

tags:

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

一、Docker 镜像操作

1、搜索镜像

格式:docker search 关键字
docker search nginx

2、获取镜像(创建镜像)

格式:docker pull 镜像:标签
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
docker pull nginx

3、镜像加速下载

  • 浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://y33hqxx2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4、查看镜像信息

镜像下载后存放在 /var/lib/docker 

5、查看下载的镜像文件信息

cat /var/lib/docker/image/overlay2/repositories.json

6、查看下载到本地的所有镜像

docker images

REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    ae2feff98a0c   9 days ago   133MB
--------------------------------------------------------------------------------------------
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;
--------------------------------------------------------------------------------------------

7、根据镜像的唯一标识 ID 号,获取镜像详细信息

很重要,镜像排错的第一步

格式:docker inspect 镜像ID号
docker inspect 08b152afcfae

8、为本地的镜像添加新的标签

格式:docker tag 名称:[标签] 新名称:[新标签]
docker tag nginx:latest nginx:web

docker images | grep nginx

9、上传镜像

默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。

docker tag nginx:latest nginx:web		#添加新的标签
docker login								#登录公共仓库
Username:
password:
docker push wangdahcu/nginx:web					#上传镜像

先注册一个docker账号

docker注册https://hub.docker.com/choose-plan?ref=signup



10、导出镜像:将镜像保存成为本地文件

格式:docker save -o /目录/文件名 存储的镜像:版本
docker save -o nginx nginx:latest			#存出镜像命名为nginx存在当前目录下
ls -lh

11、导入镜像:将镜像文件导入到镜像库中

格式:
docker load < 存出的文件
或者
docker load -i 存出的文件
或者
docker load --input nginx

docker load < nginx

12、删除镜像

格式:
docker rmi 仓库名称:标签				#当一个镜像有多个标签时,只是删除其中指定的标签
或者
docker rmi 镜像ID号						#会彻底删除该镜像(加-f强制删除)

#删除所有镜像,但该镜像创建的容器不能处于up状态
docker rmi `docker images -qa`

注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
先通过docker-compose down 停止服务;后再次执行删除;

docker rmi nginx:web

二、Docker 容器操作

1、容器创建:就是将镜像加载到容器的过程

  • 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
格式:docker create [选项] 镜像
常用选项:
-i:让容器的输入保持打开
-t:让 Docker 分配一个伪终端

docker create -it nginx:latest /bin/bash

2、运行容器

docker run -it nginx:latest /bin/bash
docker run -itd nginx:latest /bin/bash

-i:表示标准输入
-t:指定一个伪终端(环境)
-d:开启守护进程(后台运行)

3、退出容器

#退出并停止容器
exit

#退出但不停止容器
crtl +p +q

4、进入容器

  • 需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。
格式:docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。

#进入正在运行的容器
docker attach 容器ID

docker ps                        #获取正在运行的容器ID
docker start 2592d3fad0fb		 #进入容器前,确保容器正在运行
docker exec -it 2592d3fad0fb /bin/bash
ls
exit			               	#退出容器后,容器仍在运行
docker ps -a

docker run -it centos:7 bash        #不加-d选项会创建容器后直接进入容器,但是退出容器,容器也会停止

5、查看容器的运行状态

#查看正在运行的容器
docker ps

#查看所有容器
docker ps -a			#-a 选项可以显示所有的容器
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS    PORTS     NAMES
8b0a7be0ff58   nginx:latest   "/docker-entrypoint.…"   57 seconds ago   Created             inspiring_swanson
容器的ID号	   加载的镜像     运行的程序                  创建时间        当前的状态   端口映射  名称

#查看所有容器的ID
docker ps -aq

①、查看运行中的容器

docker container ls

CONTAINER ID :运行中容器的唯一号码(自动生成)

NAMES :容器的名字(默认自动生成,可手工指定,不可重复)
    手工指定:在开启容器时指定 docker container run -it --name="ljm" 9f266d35e02c

IMAGE :镜像的ID

STATUS :运行状态 (up为运行中,exited为关闭掉的容器。可使用 docker container ls -a 查看所有状态)

②、查看所有容器信息

docker container ls -a
或
docker ps -a

③、只查看容器的运行ID

docker container ls -a -q
或
docker ps -a -q

④、查看容器详细信息

docker container inspect 容器名或者运行号码

⑤、可查看容器内进程信息

docker container top 容器的ID

⑥、查看容器的日志信息

docker container logs [-ft] 容器的ID
-f 为持续监控,-t 为更加详细显示

6、启动容器

格式:docker start 容器的ID/名称
docker start 8b0a7be0ff58
docker ps -a

7、创建并启动容器

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。

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

  • docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中
  • pid=1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
(2)利用镜像创建并启动一个容器;
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
(5)分配一个地址池中的 IP 地址给容器;
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。

docker run centos:7 /usr/bin/bash -c ls /
docker ps -a			#会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

8、在后台持续运行 docker run 创建的容器

  • 需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。
docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"

docker ps -a					#可以看出容器始终处于 UP,运行状态
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS         PORTS     NAMES
2592d3fad0fb   centos:7   "/usr/bin/bash -c 'w…"   2 seconds ago    Up 2 seconds             peaceful_chatelet

docker run -itd --name test1 centos:7 /bin/bash

9、终止容器运行

格式:docker stop 容器的ID/名称
docker stop 2592d3fad0fb

docker ps -a

10、复制到容器中

echo abc123 > ~/test.txt
docker cp ~/test.txt 2592d3fad0fb:/opt/

11、从容器复制文件到主机

docker cp 2592d3fad0fb:/opt/test.txt ~/abc123.txt

12、容器的导出与导入

  • 用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
#导出格式:docker export 容器ID/名称 > 文件名
docker export 2592d3fad0fb > centos7tar

#导入格式:cat 文件名 | docker import – 镜像名称:标签
cat centos7tar | docker import - centos7:test			#导入后会生成镜像,但不会创建容器

13、暴露端口

docker run -d -p 500:80 nginx:latest
docker run -d -P 500:80 nginx:latest

#-p(小写):暴露指定端口
#-P(大写):暴露随机端口
#######
docker run -p(小写)
后面的参数有四种格式,列举如下:
docker run -p container_port                    #将容器的某个端口映射到宿主机的所有接口的(接口可以认为是IP地址)一个随机端口上。
docker run -p host_port:container_port          #将容器的某个端口映射到宿主机的所有接口的一个具体端口上。
docker run -p host_ip:host_port:container_port  #将容器的某个端口映射到宿主机的一个具体IP地址的具体端口上。
docker run -p host_ip::container_port           #将容器的某个端口映射到宿主机的一个具体IP地址的一个随机端口上。
#可以通过命令docker port 容器名字或者ID查看映射后的端口信息,能够看到容器的端口与宿主机的哪一个端口建立了映射关系。

#######
docker run -P(大写)
不需要额外的参数,其作用是将容器内部暴露所有的端口分别映射到宿主机的所有接口的一个随机端口上。

14、链接容器

--link

:
docker pull centos:7
docker run -itd -P --name web1 centos:7 /bin/bash
docker run -itd -P --name web2 --link web1 centos:7 /bin/bash

docker ps

docker attach web1镜像id
yum -y install net-tools
#获取IP地址
ifconfig
ctrl +p +q
docker ps
docker attach web2镜像id
ping web1IP地址

15、删除容器

格式:docker rm [-f] 容器ID/名称
docker stop 容器ID

#删除已经终止状态的容器
docker rm 2592d3fad0fb				

#强制删除正在运行的容器
docker rm -f 2592d3fad0fb

#删除非up状态的所有容器
docker rm $(docker ps -qa)

#强制删除所有容器
docker rm -f `docker ps -qa`			

docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash			#批量停止容器
docker ps- a | awk 'NR>=2{print $1}' | xargs docker stop

docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash				#批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm

docker images | awk 'NR>=2{print "docker rmi "$3}' | bash			#批量删除镜像
docker images | grep none | awk ' {print $3}' | xargs docker rmi    #删除none镜像

16、数据卷和数据容器

  • 两者的区别:
    • 数据卷是宿主机和容器之间的共享
    • 数据卷容器是容器和容器之间的共享
例如:数据卷
docker run -it -v /root/aaa:/bbb centos:7 /bin/bash

例如:数据卷容器
docker run -it -v /aaa -v /bbb --name wdc centos:7 /bin/bash
docker run -it --volumes-from wdc --name katalina centos:7 /bin/bash

三、Docker 仓库操作

1、搭建本地私有仓库

#首先下载registry 镜像
docker pull registry

#在daemon.json文件中添加私有镜像仓库地址
vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.80.10:5000"],   #添加,注意用逗号结尾
"registry-mirrors": ["https://6ijb8ube.mirror.aliyuncs.com"]
}

systemctl restart docker.service

#运行registry 容器
docker run -itd -v /data/registry:/var/lib/registry -p 5000: 5000 --restart=always --name registry registry:latest
-------------------------------------------------
-itd: 在容器中打开一个伪终端进行交互操作,并在后台运行
-v: 把宿主机的/data/registry目录绑定到容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了
--restart=always: 这是重启的策略,在容器退出时总是重启容器
--name registry: 创建容器命名为registry
registry:latest:这个是刚才pull下来的镜像
---------------------------------------------------
Docker容器的重启策略如下:
no:默认策略,在容器退出时不重启容器
on-failure:在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3 :在容器非正常退出时重启容器,最多重启3次
always:在容器退出时总是重启容器
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

#为镜像打标签
docker tag centos:7 192.168.80.10:5000/centos:v1

#上传到私有仓库
docker push 192.168.80.10:5000/centos:v1

#列出私有仓库的所有镜像
curl http://192.168.80.10:5000/v2/_catalog

#出私有仓库的centos 镜像有哪些tag
curl http://192.168.80.10:5000/v2/centos/tags/list

#先删除原有的 centos 的镜像,再测试私有仓库下载
docker rmi -f 8652b9f0cb4c
docker pull 192.168.80.10:5000/centos:v1 

以上是关于Docker容器的基本操作的主要内容,如果未能解决你的问题,请参考以下文章

linux_docker入门

使用 vs 代码对本机 docker 容器做出反应以发布到主机操作系统上的 android 模拟器

Docker 镜像容器仓库三大基本概念

Docker容器基本知识

Docker容器学习--1

Docker容器