1. 什么是docker

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker的核心思想就是来自集装箱;集装箱的概念是隔离货物,所以docker的核心就是隔离机制。同时docker使用可移植镜像所以部署以及运维极其方便快捷。

docker中的容器:

  • lxc --> libcontainer --> runC

1.1 OCI&OCF

OCI

开放容器倡议:

  • 由Linux基金会主导于2015年6月创立
  • 旨在围绕容器格式和运行时制定一个开放的工业化标准

包含两个规格

  • 运行时规范(runtime-spec)
  • 镜像规范(image-spec)

OCF

开放式容器格式:

runC 是一个 CLI 工具,用于根据 OCI 规范生成和运行容器

  • 容器作为 runC 的子进程启动,可以嵌入到各种其他系统中,而无需运行守护进程
  • runC 建立在 libcontainer 之上,同样的容器技术为数百万个 Docker 引擎安装提供支持

docker提供了一个专门容纳容器镜像的站点:点此

1.2 Docker引擎架构

1.3 Docker运行架构

1.4 docker架构

2. docker镜像与镜像仓库


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

3. docker对象

当你使用 docker 时,相当于正在创建和使用图像、容器、网络、卷、插件和其他对象。

  • IMAGES (镜像)
  1. 图像是一个只读模板,其中包含创建 docker 容器的说明。

  2. 一般情况下,一个镜像基于另一个镜像,并带有一些额外的自定义。

  3. 镜像的获取:

    • 从远程仓库下载
    • 朋友拷贝给你
    • 自己制作docker镜像(DockerFile)
  • CONTAINERS (容器)
  1. 容器是镜像的可运行实例。
  2. 您可以使用 docker API 或 CLI 创建、运行、停止、移动或删除容器。
  3. 您可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建新镜像。

4. docker的安装及使用

4.1 docker安装

//配置yum仓库
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

//配置docker的yum源
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1919  100  1919    0     0  12380      0 --:--:-- --:--:-- --:--:-- 12380
[root@localhost yum.repos.d]# ls
CentOS-Base.repo             CentOS-Linux-ContinuousRelease.repo  CentOS-Linux-Extras.repo            CentOS-Linux-Media.repo       CentOS-Linux-Sources.repo
CentOS-Linux-AppStream.repo  CentOS-Linux-Debuginfo.repo          CentOS-Linux-FastTrack.repo         CentOS-Linux-Plus.repo        docker-ce.repo
CentOS-Linux-BaseOS.repo     CentOS-Linux-Devel.repo              CentOS-Linux-HighAvailability.repo  CentOS-Linux-PowerTools.repo
[root@localhost yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo

//下载docker所需要的环境
[root@localhost yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2

//安装docker
[root@localhost yum.repos.d]# yum -y install docker-ce

4.2 docker加速

一般来说docker下载镜像相当缓慢,需要配置加速来使用
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。

docker的加速有多种方式:

  • docker cn
  • 中国科技大学加速器
  • 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)

设置阿里云镜像加速

[root@localhost ~]# systemctl start docker
[root@localhost ~]# cat > /etc/docker/daemon.json <<EOF
> {
>   "registry-mirrors": ["写自己的阿里云加速地址"]
> }
> EOF
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# systemctl daemon-reload

4.3 docker常用操作

命令功能
docker search从Docker Hub镜像仓库上查找镜像
docker pull从Docker Hub镜像仓库上拉取镜像
docker images列出本地的镜像
docker create创建一个新的容器(与run命令不同,使用create命令只能创建容器而并不启动)
docker start启动容器
docker run根据镜像新建并启动容器
docker attach进入到一个正在运行容器内(使用exit命令退出后,容器会停止)
docker ps列出当前所有正在运行的容器
docker logs获取容器的日志
docker restart重新启动容器
docker stop停止正在运行的容器
docker kill杀死正在运行的容器
docker rm删除容器
docker exec进入到一个正在运行容器内(使用exit命令退出后,容器会继续运行)
docker info显示当前系统信息、docker容器、镜像个数、设置等信息
docker inspect用于以JSON格式显示容器与镜像的详细信息
//查看docker的版本信息
[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.11
 API version:       1.41
 Go version:        go1.16.9
 Git commit:        dea9396
 Built:             Thu Nov 18 00:36:58 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.11
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.9
  Git commit:       847da18
  Built:            Thu Nov 18 00:35:20 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

//查看docker的详细信息
[root@localhost ~]#  docker info 
Client:             #docker客户端信息
 Context:    default
 Debug Mode: false
 Plugins:           #插件
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)
  scan: Docker Scan (Docker Inc., v0.9.0)

Server:                          #docker服务器端信息
 Containers: 0                   #容器数量
  Running: 0                     #正在运行的数量
  Paused: 0                      #暂停的数量
  Stopped: 0                     #已停止的数量
 Images: 0                       #镜像数量                
 Server Version: 20.10.11           #docker服务器版本	 
 Storage Driver: overlay2           #docker存储驱动程序
  Backing Filesystem: xfs           #文件系统
  Supports d_type: true         
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file          #日志驱动程序
 Cgroup Driver: cgroupfs            #Cgroup驱动程序
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive                      #Swarm状态  
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc                 #默认runtime
 Init Binary: docker-init
 containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc version: v1.0.2-0-g52b36a2
 init version: de40ad0
 Security Options:                       #安全选项
  seccomp
   Profile: default
 Kernel Version: 4.18.0-305.3.1.el8.x86_64   #linux内核版本
 Operating System: CentOS Linux 8    #linux操作系统
 OSType: linux
 Architecture: x86_64
 CPUs: 2                              #宿主机CPU数量
 Total Memory: 1.748GiB              #宿主机内存
 Name: localhost.localdomain         #宿主机名称
 ID: XNOI:YZS3:33XD:GJ5P:LI5T:IMNW:2J2E:H737:LJNR:K2CC:FSRJ:WGLG
 Docker Root Dir: /var/lib/docker       #docker根目录
 Debug Mode: false
 Registry: https://index.docker.io/v1/      #镜像仓库
 Labels:
 Experimental: false
 Insecure Registries:                #非安全镜像仓库
  127.0.0.0/8
 Registry Mirrors:                      #镜像加速器
  https://xxxxxxx.mirror.aliyuncs.com/
 Live Restore Enabled: false

4.3.1 镜像操作

//从docker仓库中搜索镜像
[root@localhost ~]# docker search centos
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                            The official build of CentOS.                   6904      [OK]       
ansible/centos7-ansible           Ansible on Centos7                              135                  [OK]
consol/centos-xfce-vnc            Centos container with "headless" VNC session…   131                  [OK]
jdeathe/centos-ssh                OpenSSH / Supervisor / EPEL/IUS/SCL Repos -121                  [OK]
centos/systemd                    systemd enabled base container.                 105                  [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   92                   
imagine10255/centos6-lnmp-php56   centos6-lnmp-php56                              58                   [OK]

......
NAME			//镜像仓库源的名称
DESCRIPTION		//表示该镜像的功能
STARS			//表示下载热度
OFFICIAL		//是否docker官方发布
AUTOMATED		//自动构建
.....

//从docker仓库中下载镜像
[root@localhost ~]# docker pull centos 
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

//查看本地主机上的所有/指定镜像
docker images [镜像名] 	
选项:
-a 			//列出本地所有的镜像;
--digests 		//显示镜像的摘要信息;
-q 			//只显示镜像ID。

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       latest    5d0da3dc9764   2 months ago   231MB

REPOSITORY    		//镜像的仓库源
TAG           		//镜像标签
IMAGE ID      		//镜像ID
CREATED       		//镜像创建时间
SIZE          		//镜像大小

//获取镜像的详细信息
[root@localhost ~]# docker inspect centos:latest
[
    {
        "Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "RepoTags": [
            "centos:latest"
        ],
        "RepoDigests": [
            "centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-09-15T18:20:05.184694267Z",
        "Container": "9bf8a9e2ddff4c0d76a587c40239679f29c863a967f23abf7a5babb6c2121bf1",
        "ContainerConfig": {
            "Hostname": "9bf8a9e2ddff",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
.....//添加镜像标签,类似于别名
[root@localhost ~]# docker tag centos:latest centos:1.1
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       1.1       5d0da3dc9764   2 months ago   231MB
centos       latest    5d0da3dc9764   2 months ago   231MB

//删除镜像
docker rmi 镜像名:标签	
选项:
-f			//强制删除

[root@localhost ~]# docker rmi centos:1.1
Untagged: centos:1.1
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       latest    5d0da3dc9764   2 months ago   231MB

//导出镜像
[root@localhost ~]# docker save -o /tmp/centos centos:latest 
[root@localhost ~]# cd /tmp
[root@localhost tmp]# ls
centos 

//载入镜像
[root@localhost ~]# docker load < /tmp/centos
Loaded image: centos:latest

4.3.2 容器操作

容器创建命令

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

//使用centos镜像启动一个名为centos02的容器并分配一个bash shell的终端进入容器
[root@localhost ~]# docker run --name centos02 -it centos /bin/bash
[root@30631e320b4f /]# exit
exit

注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行

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

//使用centos镜像启动一个名为centos04的容器,该容器在后台运行,访问宿主机的8080端口可以访问到容器的80端口
[root@localhost ~]# docker run --name centos04 -d -p 8080:80 centos
d147a3cf5693bc7ea8aac00ab84f06e3166a3746c252a9c14d92c61a3ed8992e

容器查看命令

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

//查看所有容器状态
[root@localhost ~]# docker ps -a 
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
d147a3cf5693   centos    "/bin/bash"   32 seconds ago   Exited (0) 31 seconds ago             centos04
d7d3b91954d3   centos    "/bin/bash"   2 minutes ago    Exited (0) 2 minutes ago              centos03
30631e320b4f   centos    "/bin/bash"   3 minutes ago    Exited (0) 3 minutes ago              centos02
03a5336c593d   centos    "/bin/bash"   7 minutes ago    Created                               centos01

CONTAINER ID		//容器 ID
IMAGE			//使用的镜像
COMMAND			//启动容器时运行的命令
CREATED			//容器的创建时间
STATUS			//容器状态
状态有7种:
	created(已创建)
	restarting(重启中)
	running(运行中)
	removing(迁移中)
	paused(暂停)
	exited(停止)
	dead(死亡)
PORTS			//容器的端口信息和使用的连接类型(tcp\udp)。
NAMES			//容器名称

//查看容器详细信息
[root@localhost ~]# docker inspect centos04
[
    {
        "Id": "d147a3cf5693bc7ea8aac00ab84f06e3166a3746c252a9c14d92c61a3ed8992e",
        "Created": "2021-12-01T18:24:37.775412386Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "exited",
            "Running": false,
.....

容器生命周期管理命令

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

容器占用资源查看命令

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

容器日志查看命令

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

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

//创建一个后台运行容器
[root@localhost ~]# docker run --name centos05 -d -it centos /bin/bash
4054570d47c1be7460546ab923f6d5e2709a0ec74775d0f6a748be1a3bc90696
[root@localhost ~]# docker ps -a 
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
4054570d47c1   centos    "/bin/bash"   5 seconds ago    Up 4 seconds                          centos05
d147a3cf5693   centos    "/bin/bash"   8 minutes ago    Exited (0) 8 minutes ago              centos04
d7d3b91954d3   centos    "/bin/bash"   10 minutes ago   Exited (0) 2 minutes ago              centos03
30631e320b4f   centos    "/bin/bash"   11 minutes ago   Exited (0) 11 minutes ago             centos02
03a5336c593d   centos    "/bin/bash"   15 minutes ago   Exited (0) 2 minutes ago              centos01

//连接到正在运行的容器进程中,默认连接到容器启动时启动的进程
[root@localhost ~]# docker attach centos05
[root@4054570d47c1 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

//不进入容器执行容器中的命令
docker exec 容器名 执行命令	
选项:
-d				//后台执行,不显示结果
-it				//为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端
[root@localhost ~]# docker exec centos05 ls
bin
dev
etc
home
lib
lib64
lost+found
media
....//使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@localhost ~]#  docker exec -it centos05 /bin/bash
[root@4054570d47c1 /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
4054570d47c1   centos    "/bin/bash"   4 minutes ago    Up 4 minutes                          centos05
d147a3cf5693   centos    "/bin/bash"   12 minutes ago   Exited (0) 12 minutes ago             centos04
d7d3b91954d3   centos    "/bin/bash"   14 minutes ago   Exited (0) 6 minutes ago              centos03
30631e320b4f   centos    "/bin/bash"   16 minutes ago   Exited (0) 16 minutes ago             centos02
03a5336c593d   centos    "/bin/bash"   19 minutes ago   Exited (0) 6 minutes ago              centos01

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

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

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

容器导出和导入命令

docker export 容器名 > 导出的容器文件名	//容器导出

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

容器删除命令

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

[root@localhost ~]# docker rm centos01
centos01
[root@localhost ~]# docker rm centos05
Error response from daemon: You cannot remove a running container 4054570d47c1be7460546ab923f6d5e2709a0ec74775d0f6a748be1a3bc90696. Stop the container before attempting removal or force remove
[root@localhost ~]# docker rm -f  centos05
centos05
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
d147a3cf5693   centos    "/bin/bash"   15 minutes ago   Exited (0) 15 minutes ago             centos04
d7d3b91954d3   centos    "/bin/bash"   16 minutes ago   Exited (0) 9 minutes ago              centos03
30631e320b4f   centos    "/bin/bash"   18 minutes ago   Exited (0) 18 minutes ago             centos02

//批量删除所有容器
[root@localhost ~]# docker rm `docker ps -qa`
d147a3cf5693
d7d3b91954d3
30631e320b4f
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐