Docker总结

Docker

什么是Docker

Docker是基于Go语言实现的云开源项目。

Docker的主要目标是“Build,Ship and Run Any App , Anywhere”,也就是通过对应用组件的封装、分 发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行 环境能够做到“一次封装,到处运行”。

Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

Docker安装

基本构成

镜像(image):

Docker镜像(Image)就是一个只读的模板。
镜像可以用来创建 Docker容器,一个镜像可以创建很多容器。
就好似Java中的类和对象,类就是镜像,容器就是对象!

容器(container):

Docker利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的Linux 环境(包括root用户权限、
进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,
唯一区别在于容器的最上面那一层是可读可写的。

仓库(repository):

仓库(Repository)是集中存放镜像文件的场所。 仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。 国内的公开仓库包括阿里云 、网易云等

总结:

  • Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个 可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生 成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。 同一个 image 文件,可以生成多个同时运行的容器实例。
  • image 文件生成的容器实例,本身也是一个文件,称为镜像文件
  • 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例, 也就是我们的容器
  • 至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。

安装环境

建议安装在linux系统上,通过uname -r来查看本机的架构信息,或使用cat /etc/os-release查看系统版本等信息。

官网安装参考手册:https://docs.docker.com/engine/install/centos/

安装卸载步骤

  1. yum安装gcc相关环境

    yum -y install gcc
    yum -yin stall gcc-c++
    
  2. 写在老旧版本

    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  3. 安装需要的软件包

    yuminstall-yyum-utils
    
  4. 设置仓库镜像

    # 错误
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 
    ## 报错
    [Errno 14] curl#35 - TCP connection reset by peer
    [Errno 12] curl#35 - Timeout
    # 正确推荐使用国内的
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo
    
  5. 更新yum软件包索引

    yum makecache fast
    
  6. 安装 Docker CE

    yum install docker-ce docker-ce-cli containerd.io
    
  7. 启动Docker

systemctl start docker
  1. 命令测试

    docker version
    docker run hello-world
    docker images
    
  2. 卸载

    systemctl stop docker
    
    yum -y remove docker-ce docker-ce-cli containerd.io
    
    rm -rf /var/lib/docker
    

可配置aliyun镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://qiyb9988.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker常用命令

帮助命令

docker version # 显示 Docker 版本信息。
docker info # 显示 Docker 系统信息,包括镜像和容器数。
docker --help # 帮助

镜像命令

docker images

~ » docker images    # 列出本地主机上的镜像 

REPOSITORY                  TAG       IMAGE ID       CREATED        SIZE
docker101tutorial           latest    f925f4719971   6 hours ago    28.2MB
pzym321/docker101tutorial   latest    f925f4719971   6 hours ago    28.2MB
docker/getting-started      latest    083d7564d904   2 months ago   28MB

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

# 同一个仓库源可以有多个TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同的镜像,如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像!

# 可选项
-a: 列出本地所有镜像 
-q: 只显示镜像id 
--digests: 显示镜像的摘要信息

docker search

# 搜索镜像
~ » docker search redis                                                             
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis                            Redis is an open source key-value store that…   9881      [OK]

# docker search 某个镜像的名称 对应DockerHub仓库中的镜像
# 可选项
--filter=stars=5000 : 列出收藏数不小于指定值的镜像。

~ » docker search redis --filter=stars=5000 

NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis     Redis is an open source key-value store that…   9881      [OK]

docker pull

# 下载镜像
~ » docker pull mysql                                                               
Using default tag: latest # 不写tag,默认是latest
latest: Pulling from library/mysql
a330b6cecb98: Pull complete
9c8f656c32b8: Pull complete
88e473c3f553: Pull complete
062463ea5d2f: Pull complete
daf7e3bdf4b6: Pull complete
1839c0b7aac9: Pull complete
cf0a0cfee6d0: Pull complete
1b42041bb11e: Pull complete
10459d86c7e6: Pull complete
b7199599d5f9: Pull complete
1d6f51e17d45: Pull complete
50e0789bacad: Pull complete
Digest: sha256:99e0989e7e3797cfbdb8d51a19d32c8d286dd8862794d01a547651a896bcf00c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实位置

# 等价于 docker pull docker.io/library/mysql:latest
-------------------------------------------------------------------------------------------------
~ » docker pull mysql:5.7  # 写版本的                                                        
...

docker rmi

# 删除镜像
docker rmi -f 镜像id # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个
docker rmi -f $(docker images -qa)   # 删除全部

容器命令

说明:有镜像才能创建容器,我们这里使用 centos 的镜像来测试,就是虚拟一个 centos !

新建容器并启动

# 命令
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
# 常用参数说明 
--name="Name" # 给容器指定一个名字
-d # 后台方式运行容器,并返回容器的id!
-i # 以交互模式运行容器(即使没有连接,也要保持标准输入保持打开状态),通过和 -t 一起使用
-t # 给容器重新分配一个终端,通常和 -i 一起使用
-P # 随机端口映射(大写)
-p # 指定端口映射(小结),一般可以有四种写法
      ip:hostPort:containerPort 
      ip::containerPort 
      hostPort:containerPort (常用) 
      containerPort
      
#  不懂就参考博客
# https://blog.csdn.net/claram/article/details/104228727?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.essearch_pc_relevant&spm=1001.2101.3001.4242

# 测试
# 使用centos进行用交互模式启动容器,在容器内执行/bin/bash命令!
~ » docker run -it centos /bin/bash #默认的就是/bin/bash,所以可以不写,也可使用/bin/sh

列出所有运行的容器

# 命令
docker ps [OPTIONS]

# 常用参数说明
-a # 列出当前所有正在运行的容器 + 历史运行过的容器
-l # 显示最近创建的容器
-n=? # 显示最近n个创建的容器
-q # 静默模式,只显示容器编号。

退出容器

exit # 容器停止退出
ctrl+P+Q # 容器不停止退出

启动停止容器

docker start (容器id or 容器名)   # 启动容器
docker restart (容器id or 容器名) # 重启容器
docker stop (容器id or 容器名)    # 停止容器
docker kill (容器id or 容器名)    # 强制停止容器

删除容器

docker rm 容器id                 # 删除指定容器 
docker rm -f $(docker ps -a -q) # 删除所有容器 
docker ps -a -q|xargs docker rm # 删除所有容器

删除和停止容器的区别在于,停止了容器,后续可以通过docker ps -a 查询全部容器,然后重启已经停止的容器,然而docker rm的话,就无法重启了,因为此容器不存在了。

进入正在运行的容器

# 命令1
docker exec -it 容器id bashShell
# 命令2
docker attach 容器id

查看容器/镜像的元数据

# 命令
docker inspect 容器id

docker inspect 39f20f911169                                                    
[
    {
        "Id": "39f20f911169249f652bd1686e8833bbece65d9a2e3f949d2c30e6aa487ea4a8",
        "Created": "2021-09-04T11:56:13.8819721Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4217,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-09-04T12:11:44.1859855Z",
            "FinishedAt": "2021-09-04T12:11:40.6349685Z"
        },
        ...

从容器内拷贝文件到主机上

# 命令
docker cp 容器id:容器内路径 目的主机路径

docker attach 39f20f911169                                                     1 ↵ 
[root@39f20f911169 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@39f20f911169 /]# cd home
[root@39f20f911169 home]# ls
[root@39f20f911169 home]# touch text.c
[root@39f20f911169 home]# ls
text.c
~ » docker attach 39f20f911169                                                     
[root@39f20f911169 home]# ls
text.c
[root@39f20f911169 home]# pwd
/home
[root@39f20f911169 home]# exit
exit

~ » docker cp 39f20f911169:/home/text.c ~                                              
~ » ls |grep text.c                                                                    
text.c

小结

attach  # 当前 shell 下attach 连接指定运行镜像
build  # 通过 Dockerfile 定制镜像
commit  # 提交当前容器为新的镜像
cp  #从容器中拷贝指定文件或者目录到宿主机中
create  # 创建一个新的容器,同run,但不启动容器
diff  # 查看 docker 容器变化
events  # 从 docker 服务获取容器实时事件
exec # 在已存在的容器上运行命
令
export  # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history  # 展示一个镜像形成历史
images  # 列出系统当前镜像
import  # 从tar包中的内容创建一个新的文件系统映像[对应export]
info  # 显示系统相关信息
inspect  # 查看容器详细信息
kill  # kill 指定 docker 容器
load  # 从一个 tar 包中加载一个镜像[对应 save]
login  # 注册或者登陆一个docker 源服务器
logout  # 从当前 Dockerregistry 退出
logs  # 输出当前容器日志信息
port  #查看映射端口对应的容器内部源端口
pause  # 暂停容器
ps  # 列出容器列表
pull  #从docker镜像源服务器拉取指定镜像或者库镜像
push  #推送指定镜像或者库镜像至docker源服务器
restart  # 重启运行的容器
rm  # 移除一个或者多个容器
rmi  # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run  # 创建一个新的容器并运行一个命令
save  # 保存一个镜像为一个tar 包[对应 load]
search  # 在 docker hub 中搜索镜像
start  # 启动容器
stop  # 停止容器
tag  # 给源中镜像打标签
top  # 查看容器中运行的进程信息
unpause  # 取消暂停容器
version  # 查看 docker 版本号
wait  # 截取容器停止时的退出状态值

练习

使用docker安装nginx

#先搜索nginx
~ » docker search nginx                                                                
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        15416     [OK]

# 拉取nginx镜像
~ » docker pull nginx                                                            125 ↵ 
Using default tag: latest
latest: Pulling from library/nginx
a330b6cecb98: Already exists
5ef80e6f29b5: Pull complete
f699b0db74e3: Pull complete
0f701a34c55e: Pull complete
3229dce7b89c: Pull complete
ddb78cb2d047: Pull complete
Digest: sha256:a05b0cdd4fc1be3b224ba9662ebdf98fe44c09c0c9215b45f84344c12867002e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

#运行后台容器并且取别名nginx1,使用主机端口3344容器端口80
» docker run -d --name nginx1 -p 3344:80 nginx                                 125 ↵ 
4e5e2154d958e92ee873850c3d207309eac3bb6992367381c6ccedd5d7885f1b

# curl内网测试,打印结果测试成功
~ » curl localhost:3344                                                            3 ↵ 



Welcome to nginx!