前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >001.Docker入门基础篇

001.Docker入门基础篇

作者头像
CoderJed
发布2020-11-12 12:00:30
3500
发布2020-11-12 12:00:30
举报
文章被收录于专栏:Jed的技术阶梯Jed的技术阶梯

1. Docker安装

1.1 安装并启动Docker

代码语言:javascript
复制
# 1.准备yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum clean all
yum makecache

# 2.安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 列出yum源存储库中可用的版本,按版本号降序排序
[admin@bdc01 yum.repos.d]$ yum list docker-ce.x86_64 --showduplicates | sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
...
# 说明,如果需要安装指定版本的docker,则需要根据以上信息拼接具体版本
# 第一列:docker-ce.x86_64,"."之前的字符串,str1 = "docker-ce"
# 第一列:docker-ce.x86_64,"."之后的字符串,str2 = "x86_64"
# 第二列:18.03.1.ce-1.el7.centos,str3 = "18.03.1.ce-1.el7.centos"
# docker的版本完整版本号为:str1 + "-" + str3 + "." + str2
# 上述第一行数据,docker的完整版本号为:docker-ce-18.03.1.ce-1.el7.centos.x86_64

# 3.安装docker-ce
# 安装最新版
yum install docker-ce docker-ce-cli containerd.io
# 安装指定版本示例
yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos.x86_64 docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
yum install -y --setopt=obsoletes=0 docker-ce-18.03.1.ce-1.el7.centos.x86_64 docker-ce-selinux-18.03.1.ce-1.el7.centos.noarch

# 4.启动docker
[admin@bdc01 ~]$ sudo systemctl daemon-reload
[admin@bdc01 ~]$ sudo systemctl restart docker
[admin@bdc01 ~]$ sudo docker version
Client:
 Version:      17.03.2-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:21:36 2017
 OS/Arch:      linux/amd64
...
[admin@bdc01 yum.repos.d]$ sudo docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.03.2-ce
Storage Driver: overlay
...

1.2 配置镜像加速

开通成功之后,会为你的账户分配一个镜像加速的地址:

代码语言:javascript
复制
# 配置镜像加速
# 将镜像加速地址改成自己的地址
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2. Docker体系结构

  • Docker包括三个基本概念
    • 镜像(Image):相当于是一个root文件系统,比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统
    • 容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等,Docker容器通过Docker镜像来创建
    • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像
  • Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器
  • 客户端执行build、pull、run命令发送到DOCKER_HOST(服务端)
  • DOCKER_HOST的守护进程(Docker daemon)创建容器
  • 拉取镜像先从本地(Images)拉取,如果本地没有会去镜像仓库(Registry)拉取镜像

3. Docker镜像管理基础

代码语言:javascript
复制
# 1.在远程仓库中查询镜像
[root@bdc01 ~]# docker search centos
NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                             The official build of CentOS.                   6245      [OK]       
ansible/centos7-ansible            Ansible on Centos7                              132                  [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC sessi...   123                  [OK]
...
# NAME: 镜像仓库源的名称
# DESCRIPTION: 镜像的描述
# STARS: 类似Github里面的star,star越多,表达喜欢此镜像或者使用此镜像的人越多
# OFFICIAL: 是否docker官方发布
# AUTOMATED: 是否自动构建

# 2.获取镜像 docker pull 镜像名称[:版本]
# 下载最新版centos镜像
[root@bdc01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
# 下载指定版本的centos镜像
[root@bdc01 ~]# docker pull centos:7.5.1804

# 3.查看本地镜像
# 两个命令的效果相同
[root@bdc01 ~]# docker images
[root@bdc01 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        2 months ago        215 MB
# REPOSITORY: 镜像的仓库源
# TAG: 镜像的标签
# IMAGE ID: 镜像ID
# CREATED: 创建时间
# SIZE: 镜像大小
# 如何确定一个唯一的镜像:REPOSITORY:TAG或者IMAGE ID
# 这里查看到的镜像ID是全部ID的前12位字符,如果想查看完整ID,使用以下命令
docker images --no-trunc
docker image ls --no-trunc
# 只累出镜像ID
docker images -q
docker image ls -q
# 查看某一个本地镜像的详细信息 docker image inspect [REPOSITORY:TAG]或者docker image inspect [IMAGE ID]
[root@bdc01 ~]# docker image inspect centos:latest
[root@bdc01 ~]# docker image inspect 0d120b6ccaa8

# 4.镜像的导入导出
# 镜像导出
docker image save nginx >/opt/nginx.tar.gz
docker image save nginx:latest >/opt/nginx.tar.gz
docker image save 0d120b6ccaa8 >/opt/nginx.tar.gz
# 镜像导入
docker image load -i /opt/nginx.tar.gz

# 5.删除本地镜像
docker image rm 0d120b6ccaa8
docker rmi centos:7.5.1804
docker rmi 0d120b6ccaa8
# 删除全部本地镜像 
docker rmi `docker images -q`
docker rmi $(docker images -q)

# 设置镜像的标签
docker tag centos:latest centos:myLatest
docker tag 0d120b6ccaa8 centos:latest

4. Docker容器管理基础

代码语言:javascript
复制
# 1.交互式地启动容器
[root@bdc01 ~]# docker container run -it --name="centos.latest.container" 0d120b6ccaa8 /bin/bash
[root@bdc01 ~]# docker run -it --name centos.latest.container 0d120b6ccaa8 /bin/bash
# -i: 以交互式方式启动
# -t: 打开一个新终端
# --name: 给容器命名
# 0d120b6ccaa8:镜像ID或者是NAME:TAG
# /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是/bin/bash

# 2.退出容器终端,容器也会停止运行
[root@f1ebf6eee2c8 /]# exit

# 3.启动后台运行的容器
[root@bdc01 ~]# docker run -d --name nginx.latest.container nginx:latest
8eb3a153580b64242ac4fd7141809219cdd21fffae511d6e299f030e8dc91332
# 端口映射,容器的80端口映射到宿主机的8080端口,访问宿主机的8080端口就可以访问容器的80端口
docker run -d -p 8080:80 --name nginx.latest.container nginx:latest
# run后面没有任何参数的话,启动的容器会一直阻塞在前台
docker run --name nginx.latest.container2 f35646e83998

# 4.列出所有容器
# 列出所有正在运行的容器
[root@bdc01 ~]# docker container ls 
# 列出所有容器
[root@bdc01 ~]# docker container ls -a
# 列出所有正在运行的容器
[root@bdc01 ~]# docker ps 
# 列出所有容器
[root@bdc01 ~]# docker ps -a
CONTAINER ID  IMAGE         COMMAND      CREATED        STATUS                       PORTS  NAMES
f1ebf6eee2c8  0d120b6ccaa8  "/bin/bash"  5 minutes ago  Exited (127) 4 minutes ago          centos.latest.container
# CONTAINER ID:容器ID,自动生成,唯一标识
# IMAGE:使用的镜像
# COMMAND:启动容器后执行的第一个命令
# CREATED:创建时间
# STATUS:运行状态,Up(运行状态)、Exit(退出状态,未运行)
# NAMES:容器名称,手工指定,不能重复

# 5.查看指定容器的详细信息
docker container inspect 8eb3a153580b 

# 6.停止一个正在运行的容器
docker container stop f1ebf6eee2c8
docker stop f1ebf6eee2c8

# 7.启动一个未运行的容器
docker container start f1ebf6eee2c8
docker start f1ebf6eee2c8
# 启动并进入容器
docker container start -i f1ebf6eee2c8

# 8.重新启动容器
docker container restart f1ebf6eee2c8
docker restart f1ebf6eee2c8

# 9.进入容器内部,使用attach进入容器内部,然后exit退出容器后,容器会停止运行
docker container attach f1ebf6eee2c8
docker attach f1ebf6eee2c8
# 两个客户端使用attach进入同一个容器,那么执行的命令会同步

# 10.在容器中执行命令
docker container exec f1ebf6eee2c8 ls
docker exec f1ebf6eee2c8 echo "hello"
# 进入容器内部,使用此方式进入容器内部,然后exit退出容器后,容器不会停止运行
docker container exec -it f1ebf6eee2c8 /bin/bash

# 11.删除容器
# 删除停止运行的容器
docker rm 8eb3a153580b
# -f可以删除运行
docker rm -f 8eb3a153580b
docker container rm 8eb3a153580b
docker container rm -f 8eb3a153580b
# 清理掉所有处于终止状态的容器
docker container prune
docker container prune -f # 不再需要输入-y进行确认
# --rm会在退出容器后删除容器
[root@bdc01 ~]# docker container run -it --name="centos.latest.container" --rm 0d120b6ccaa8 /bin/bash

5. Docker网络映射

代码语言:javascript
复制
# docker自动生成了一块网卡,用于宿主机和容器的访问,网段为172.17.0.0
[root@bdc01 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:b9ff:fef5:c742  prefixlen 64  scopeid 0x20<link>
        ether 02:42:b9:f5:c7:42  txqueuelen 0  (Ethernet)
        RX packets 168  bytes 12638 (12.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38  bytes 3146 (3.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 容器启动后,其IP就在172.17.0网段
# 宿主机的IP为172.17.0.1
# 第一个启动的容器的IP为172.17.0.2
# 第二个启动的容器的IP为172.17.0.3,以此类推
# 容器之间网络互通

# 使用docker run命令启动容器的时候,可以使用-p选项来配置宿主机和容器内部网络的映射
# docker会自动添加一条iptables规则来实现端口映射
# 具体的使用方式如下:

# containerPort映射到宿主机的hostPort,例如8080:80,代表容器的80端口映射到宿主机的8080端口
-p hostPort:containerPort
 
# containerPort映射到宿主机的hostPort,例如10.0.0.11:8080:80,代表容器的80端口映射到10.0.0.11:8080地址
# 10.0.0.11是宿主机的IP地址,默认是0.0.0.0:8080
# 这种情况适用于宿主机有多个IP地址的情况
-p ip:hostPort:containerPort
 
# containerPort映射到宿主机的随机空闲端口,例如10.0.0.11::80,代表容器的80端口映射到宿主机的指定IP的随机空闲端口[32769-60999]
-p ip::containerPort

# 然后使用docker ps -a命令可以查看映射到哪个端口了
[root@bdc01 ~]# docker ps -a
CONTAINER ID  IMAGE         COMMAND                  CREATED         STATUS         PORTS                     NAMES
4852dfc9a4e3  f35646e83998  "/docker-entrypoin..."   27 seconds ago  Up 26 seconds  10.0.0.11:32768->80/tcp   nginx4

# 默认是映射到TCP协议端口,可以指定映射到UDP端口
-p hostPort:containerPort/udp

# 多个端口的映射可以使用多个-p参数来实现
-p 81:80 -p 443:443

# 使用-P(大写),也可以做到随机映射端口
# -P自动绑定所有对外提供服务的容器端口,映射的端口将会从宿主机没有使用的端口池[32769-60999]中自动选择
-P
# 示例
docker run -d -P --name="nginx1" f35646e83998

6. 其他基础管理命令

代码语言:javascript
复制
# 1.查看容器内进程的运行状况
[root@bdc01 ~]# docker container top 7ca560f1f38f
UID     PID     PPID    C    STIME    TTY  TIME       CMD
root    1814    1798    0    17:14    ?    00:00:00   nginx: master process nginx -g daemon off;
101     1854    1814    0    17:14    ?    00:00:00   nginx: worker process

# 2.查询日志
[root@bdc01 ~]# docker container logs 7ca560f1f38f
10.0.0.1 - - [26/Oct/2020:09:19:40 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
10.0.0.1 - - [26/Oct/2020:09:19:41 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://bdc01/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
2020/10/26 09:19:41 [error] 27#27: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.0.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "bdc01", referrer: "http://bdc01/"

# 相当于tail -f的功能,打开日志后在前台阻塞
docker container logs -f 7ca560f1f38f
# 展示更详细的日志
docker container logs -t 7ca560f1f38f
# 执定查看最后的几行
docker container logs --tail 10 7ca560f1f38f
# 这些参数都可以一起使用
docker container logs -tf --tail 10 7ca560f1f38f

7. Docker Volume卷管理

代码语言:javascript
复制
# 宿主机的文件拷贝到容器的指定目录下
docker container cp /root/index.html 7ca560f1f38f:/usr/share/nginx/html/
# 容器的文件拷贝到宿主机的指定目录下
docker container cp 7ca560f1f38f:/usr/share/nginx/html/index.html /root/index2.html

# 启动容器的时候,将宿主机的目录与容器的目录做映射
# 这样无论是在宿主机修改/root/html目录下的文件还是在容器中修改/usr/share/nginx/html目录下的文件
# 其实都是修改的同一个文件
docker container run -d -p 80:80 -v /root/html:/usr/share/nginx/html --name "n1" f35646e83998
# 容器销毁后,基本原镜像所做的修改都会不复存在,但是宿主机的文件是不会被删除的
# 可以使用多个-v,例如 -v /root/html:/usr/share/nginx/html -v /root/html2:/usr/share/nginx/html2来做多个映射

# 查看容器的数据卷挂载目录
docker container inspect 8897dfee0712
# 其中会有这样的信息
"Mounts": [
    {
        "Type": "bind",
        "Source": "/root/html",
        "Destination": "/usr/share/nginx/html",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],...

# 使用数据卷容器
# 首先启动一个容器,此容器专门用于做数据卷的映射
docker run -it --name volume-container -v /root/html:/usr/share/nginx/html -v /root/html2:/usr/share/nginx/html2 0d120b6ccaa8 /bin/bash
# 进去容器后,使用Ctrl+p+q退出,这样容器不会停止运行

# 启动其他容器,使用上面的数据卷容器进行数据卷的挂载
docker run -d -p 8080:80 --volumes-from volume-container --name nginx8080 f35646e83998
docker run -d -p 8081:80 --volumes-from volume-container --name nginx8081 f35646e83998
# 这两个容器启动后,都与volume-container的数据卷映射方式一样
# 在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Docker安装
    • 1.1 安装并启动Docker
      • 1.2 配置镜像加速
      • 2. Docker体系结构
      • 3. Docker镜像管理基础
      • 4. Docker容器管理基础
      • 5. Docker网络映射
      • 6. 其他基础管理命令
      • 7. Docker Volume卷管理
      相关产品与服务
      容器镜像服务
      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档