什么是docker

docker中的容器:

  • lxc --> libcontainer --> runC

OCI&OCF

OCI
开放容器倡议

  • 由Linux基金会主导于2015年6月创立
  • 旨在围绕容器格式和运行时制定一个开放的工业化标准
  • 包含两种规格
    • 运行时规范(运行时规范)
    • 图像规范(图像规范)

OCF

  • 开放容器格式
  • runC 是一个 CLI 工具,用于根据 OCI 规范生成和运行容器
    • 容器作为 runC 的子进程启动,可以嵌入到各种其他系统中,而无需运行守护程序
    • runC 建立在 libcontainer 之上,同样的容器技术为数百万个 Docker 引擎安装提供支持

docker提供了一个专门容纳容器镜像的站点:https://hub.docker.com

docker架构

docker架构
image-1659764015465

docker镜像与镜像仓库

为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的。
image-1659764434056
镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。

docker对象

使用 Docker 时,您正在创建和使用映像、容器、网络、卷、插件和其他对象。

  • IMAGES
    • 映像是一个只读模板,其中包含有关创建 docker 容器的说明。
    • 通常,一个映像基于另一个映像,并具有一些额外的自定义。
    • 您可以创建自己的映像,也可以仅使用其他人创建并在注册表中发布的映像。
  • CONTAINERS
    • 控制器是映像的可运行实例。
    • 您可以使用 Docker API 或 CLI 创建、运行、停止、移动或删除容器。
    • 可以将容器连接到一个或多个网络,将存储附加到该容器,甚至可以基于其当前状态创建新映像。

安装及使用docker

docker安装

cd /etc/yum.repos.d/
curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
yum -y install docker-ce

docker加速

docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。

docker的加速有多种方式:

  • docker cn
  • 中国科技大学加速器
  • 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://22aw5slm.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

docker event state

image-1659765620660

docker常用操作

命令 功能
docker search 在Docker Hub中搜索图像
docker pull 从注册表中提取图像或存储库
docker images 图像列表
docker create 创建一个新的容器
docker start 启动一个或多个停止的容器
docker run 在新容器中运行命令
docker attach 连接到正在运行的容器
docker ps 容器列表
docker logs 获取容器的日志
docker restart 重新启动容器
docker stop 停止一个或多个正在运行的容器
docker kill 杀死一个或多个正在运行的容器
docker rm 卸下一个或多个容器
docker exec 在正在运行的容器中运行命令
docker info 显示系统范围的信息
docker inspect 返回有关Docker对象的低级信息

容器查看命令

docker ps		        //查看容器运行状态
      选项:
            -a 			//显示所有的容器,包括未运行的
            -q			//只显示容器id
            -l			// 显示最近创建的容器。
            -f                  // "筛选条件"	 根据条件过滤显示的内容

示例:
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
257afab0feb3   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 6 seconds   80/tcp    web

CONTAINER ID		//容器 ID
IMAGE			//使用的镜像
COMMAND			//启动容器时运行的命令
CREATED			//容器的创建时间
STATUS			//容器状态
状态有7种:
	created(已创建)
	restarting(重启中)
	running(运行中)
	removing(迁移中)
	paused(暂停)
	exited(停止)
	dead(死亡)

PORTS			//容器的端口信息和使用的连接类型(tcp\udp)。
NAMES		        //容器名称

容器详细信息查看命令

docker inspect 容器名	        //查看容器详细信息

示例:
[root@localhost ~]# docker inspect web 
......略.......

容器创建命令

docker run		//从镜像运行一个容器
       选项:
          --name			//指定容器的名称,如果不指定随机给容器生成一个名称
          -it			//为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端,不建议run时使用
          -d			//容器以守护进程的方式运行
          -p 宿主机端口:容器端口	//将宿主机端口映射给容器端口
          -v 宿主机目录:容器目录	//将宿主机目录挂载到容器中;直接写容器目录省略宿主机目录,将在宿主机自动创建一个目录挂载到容器中
          --user uid:pid		//将宿主机用户和组映射至容器中
          -e			//启动容器时传递环境及其值
          --rm			//容器退出时删除容器
          --cpuset-cpus CPU序号	//容器能够使用哪些物理cpu
          --cpu-shares 数值	//CPU共享权值(相对权重)
          --memory 数值		//容器内存限制,单位b,k,m,g
          --memory-swap 数值	//容器内存+交换分区大小,不能小-m的值
          --restart 策略		//指定容器停止后的重启策略
                      no		//容器退出时不重启
                      on-failure	//容器故障退出(返回值非零)时重启
	              on-failure:3	//在容器非正常退出时重启容器,最多重启3次
	              always		//容器退出时总是重启
	              unless-stopped	//在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
           --network 网络名称	//容器网络设置
	              bridge 		//使用桥接模式
	              host		//容器使用主机的网络
	              container:NAME_or_ID //使用其他容器的网路,共享IP和PORT等网络资源
	              none 		//容器使用自己的网络(类似bridge);但是不进行配置,如分配veth pair 和网桥连接,配置IP等
           --link 容器名称		//指定容器间的关联,可以和指定容器进行通信

示例:
//使用httpd镜像启动一个名为htt的容器
[root@localhost ~]# docker run --name htt httpd 
.....略......

//使用httpd镜像启动一个名htt的容器并分配一个bash shell的终端进入容器
[root@localhost ~]# docker run --name htt -it httpd /bin/bash
root@d6c57307befd:~# 
root@d6c57307befd:~# exit
注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行


使用httpd镜像启动一个名为htt的容器并在后台运行
[root@localhost ~]# docker run --name htt  -d httpd 
f65b0bc6387abe666da51e594683cd15682ebc03a6c957724d8c3afb9c3e2f76


使用httpd镜像启动一个名为htt的容器,该容器在后台运行,访问宿主机的8080端口可以访问到容器的80端口
[root@localhost ~]# docker run --name htt -d -p 8080:80 httpd
15168e620994b369f9b164515d9fb8d0d78da84449439ccc6bedfbecee73668d
[root@localhost ~]# ss -anlt
State          Recv-Q         Send-Q                 Local Address:Port                 Peer Address:Port        Process         
LISTEN         0              128                          0.0.0.0:22                        0.0.0.0:*                           
LISTEN         0              128                          0.0.0.0:8080                      0.0.0.0:*                           
LISTEN         0              128                             [::]:22                           [::]:*                           
LISTEN         0              128                             [::]:8080                         [::]:*                           
[root@localhost ~]# curl http://192.168.91.134:8080
<html><body><h1>It works!</h1></body></html>

查看所有容器状态

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
15168e620994   httpd     "httpd-foreground"       2 minutes ago    Up 2 minutes    0.0.0.0:8080->80/tcp, :::8080->80/tcp   htt
257afab0feb3   nginx     "/docker-entrypoint.…"   26 minutes ago   Up 26 minutes   80/tcp                                  web

容器生命周期管理命令

docker start   容器名	//开启容器
docker stop    容器名	//停止容器
docker kill    容器名	//杀死容器
docker restart 容器名	//重启容器
docker pause   容器名	//暂停容器中所有的进程
docker unpause 容器名	//恢复容器中所有的进程

容器占用资源查看命令

docker stats  容器名	//查看容器使用资源信息
docker top    容器名	//查看容器中运行的进程信息,支持ps命令参数
docker port   容器名	//查看宿主机端口和容器端口之间的端口映射

容器日志查看命令

//当容器创建失败时,因为容器没有启动成功则无法看到错误日志,无法判断问题所在,下面命令可以查看日志,不管容器时候启动成功

docker logs   容器名	//获取容器的日志信息
         选项:
              -f			//跟随打印最新的日志追加在最后面
              -t			//显示日志打印的时间戳
              --tail 数量		//只显示最新的指定数量的几条日志信息

容器内进程连接和命令执行

docker attach 容器名	//连接到正在运行的容器进程中,默认连接到容器启动时启动的进程

示例:
连接到nginx02容器中的http进程,此时可以看到http工作日志
[root@localhost ~]# docker attach htt 
192.168.91.134 - - [10/Aug/2022:02:53:06 +0000] "GET / HTTP/1.1" 200 45
注意:使用attach连接到容器容器进程,一旦终止容器内的进程,容器就终止运行


如果容器启动时运行的命令是shell进程,则连接shell终端
[root@localhost ~]# docker attach htt 
root@4b34dbaf4881:~# 
root@4b34dbaf4881:~# exit
exit
注意:使用attache连接到容器的shell一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行

docker exec 容器名 执行命令	//不进入容器执行容器中的命令
    选项:
           -d				//后台执行,不显示结果
           -it				//为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端

示例:
 [root@localhost ~]# docker exec htt ls
bin
build
cgi-bin
conf
error
htdocs
.......

使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@localhost ~]# docker exec -it htt /bin/bash
root@197f5339eff6:~#
root@197f5339eff6:~# exit
exit

宿主机和容器文件复制命令

docker cp 容器名:容器文件路径 宿主机路径	//将容器中的文件复制到宿主机中
docker cp 宿主机路径 容器名:容器文件路径	//将宿主机中的文件复制到容器中

示例:
//将容器中的httpd配置文件复制到宿主机
[root@localhost ~]# docker cp htt:/usr/local/apache2/conf/httpd.conf /root/
[root@localhost ~]# ls
 httpd.conf  

容器导出和导入命令

docker export 容器名 > 导出的容器文件名	//容器导出
docker import 导出的容器文件名 镜像:标签	//容器导入,导入之后只会生成镜像

示例:
//将htt容器导出为/tmp/htt-du文件
[root@localhost ~]# docker export htt > /tmp/htt-du
[root@localhost ~]# ls /tmp/
htt-du  

将导出的容器导入为镜像,名字叫httpd-du:1
[root@localhost ~]# docker import /tmp/htt-du httpd-du:1
sha256:d692964f8c03f3f6f8f3e2f411c2c546bb51a60a2a76f93747de7ae676bc9445
[root@localhost ~]# docker images 
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
httpd-du       1         d692964f8c03   20 seconds ago   203MB

容器删除命令

docker rm 容器名			//删除容器,无法删除运行状态下的容器
          选项:
               -f				//强制,可以删除运行状态下的容器

示例:
[root@localhost ~]# docker rm htt     删除htt容
htt

[root@localhost ~]# docker rm `docker ps -qa`   批量删除所有容器
e7aec54b9a14
257afab0feb3