Docker快速入门

799 阅读13分钟

1.参考资料

官方文档:docs.docker.com/docker-for-… 仓库地址:hub.docker.com/

2.Docker 的安装

2.1.docker的组成部分

image-20210819174532504

  1. **镜像(image):**docker镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器,类似java中的Class

  2. 容器(container):类似java中通过Class创建的实例;容器可以理解为一个简易的linux系统

  3. **仓库(repository):**存放镜像的地方,

    分为共有仓库和私有仓库

    • Docker Hub:国外的

    • 阿里云:配置镜像加速

2.2.环境准备

我们要有一台服务器,并且可以操作它

  1. Linux命令基础

  2. CentOS 7

  3. 使用Xshell链接远程服务器(免费版即可)

    image-20210819175245515

2.3. 安装docker

docs.docker.com/engine/inst… 卸载旧的版本

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装基本的安装包

$ sudo yum install -y yum-utils

image-20210903152542051

设置镜像的仓库

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
    
$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云镜像

安装docker引擎

yum makecache fast

安装docker引擎

yum install docker-ce docker-ce-cli containerd.io # docker-ce 社区版 ee 企业版

CentOS 8中安装Docker出现和Podman冲突

yum erase podman buildah

继续执行安装即可

image-20210820141207869

image-20210819182217338

2.4.启动docker

systemctl start docker # 代表启动成功

image-20210819182453373

docker version

image-20210819182627553

docker run hello-world

image-20210819183126098

docker images

image-20210819183003591

2.5.卸载Docker

# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker # docker 的默认工作路径

3.docker 常用命令

以上已经用到了一些相关命名下面整体介绍一下。

命令参考地址:

docs.docker.com/engine/refe…

image-20210820142951687

3.1. 全局命令

docker version # 显示docker的基本信息
docker info # 系统信息,镜像和容器的数量
docker 命令 --help # 全部信息

3.2.镜像命令

3.2.1.docker images

docker images # 查看所有本地主机上的镜像
--all , -a		Show all images (default hides intermediate images) # 显示所有
--digests		Show digests
--filter , -f		Filter output based on conditions provided
--format		Pretty-print images using a Go template
--no-trunc		Don’t truncate output
--quiet , -q		Only show numeric IDs # 只显示id

image-20210820143814479

3.2.2. docker search

-f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output

image-20210820143959955

3.2.3.docker pull

docker pull mysql # 下载mysql镜像,default tag,默认最新版latest

image-20210820144647100

# 指定版本下载 
docker pull mysql:5.7

分层下载的好处是:不同的版本相同的部分不用重新下载。

3.2.4. docker rmi

# 删除一个 可以通过名称 也可以指定id -f表示删除所有
docker rmi -f d1165f221234
# 删除多个 用空格分隔id
docker rmi -f id id id
# 删除所有 
docker rmi -f $(docker images -aq) # images -aq就是查所有镜像id,从而递归删除

3.2.容器命令

有了镜像才能创建容器,linux,下载一个centos镜像来测试学习

3.2.1.新建容器并启动

docker run [可选参数] image
# 参数说明
# --name=“Name” # 容器名字,用于区分容器
# -it 使用交互方式运行,进入容器查看内容
# -d 后台运行
# -p 端口映射 主机端口::容器端口
# -v 卷挂载
# -e 配置
# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

image-20210904182919157

3.2.2.进入容器

docker exec -it 1de87c606832 /bin/bash

image-20210904184742854

# docker attach 1de87c606832

区别 docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用) docker attach 进入容器正在执行的终端,不会启动新的进程

# 查看目录
ls

image-20210904184829645

3.2.3.查看容器

# 查看正在运行的容器
docker ps
# 查看曾经运行的容器
docker ps -a
# 显示最近创建的容器,设置显示个数
docker ps -a - n=? 
# 只显示容器的编号
docker ps -aq

image-20210904184911149

3.2.4.退出容器

# 容器停止退出
exit
# 容器不停止退出 注意必须在英文输入法下,中文输入法不行
Ctrl + P + Q

3.2.5.删除容器

# 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f
docker rm 容器id
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有容器
docker ps -a -q|xargs docker rm

3.2.6.导入导出

docker export $CONTAINER_ID > ubuntu.tar

image-20210904191302799

$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1

3.2.7.自动重启

docker run --restart=always 容器id(或者容器名称)
#no - container:不重启
#on-failure - container:退出状态非0时重启
#always:始终重启
docker update --restart=always  容器id(或者容器名称)

3.2.8.相关状态

docker start $CONTAINER_ID
docker restart $CONTAINER_ID
docker stop $CONTAINER_ID
docker kill $CONTAINER_ID

3.3.常用其他命令

3.3.1.后台启动docker

docker run -d 镜像名
# 用docker ps 查看的时候 发现停止了

# 后台运行,docker发现前台没有,容器启动后,发现自己没有提供服务,会立刻停止

3.3.2.查看日志

docker logs
docker logs -f --tail=20  $CONTAINER_ID #查看最新20行

image-20210903164046849

3.3.3.查看容器信息

docker inspect $CONTAINER_ID 

image-20210903162732212

3.3.4.文件copy

容器copy 到主机

docker cp $CONTAINER_ID:路径 空格 主机路径
docker cp 83b0be074d94:/etc/mysql /home

主机copy 到容器

docker cp 主机路径 空格 $CONTAINER_ID:路径

后面我们会遇到

### 3.3.5.任务管理器

docker stats

image-20210903170459968

4.容器数据卷

在Docker中,要想实现数据的持久化,数据就不应该在容器中,否则容器删除,数据就会丢失。故容器之间要有一个数据共享技术,把Docker容器中产生的数据,同步到本地,这就是卷技术。

优点

  1. 容器的持久化和同步操作

  2. 容器间可以数据共享

image-20210903171643089

4.1.使用数据卷

目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:

  (1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)

img(2)bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式)

  但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

  (3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)

img

4.1.1.命令挂载

docker run -it -v -p  /宿主机绝对路径:/容器内目录:权限   镜像名
# -it 交互式进入
# -v volume卷技术
# -p 主机端口
# 挂载
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置 安装启动mysql需要配置密码
--name 容器名字

主机目录/home/mysql/conf与/etc/mysql/conf容器目录同步。

查看其信息

image-20210903172302584

soruce:主机地址

destination:容器地址

4.1.2.匿名与具名挂载

匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径。

# -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

**具名挂载:**就是挂载的卷陪一个自己的名字,可以方便的查找

# -v 卷名:/容器内路径
docker run -d -P --name nginx01 -v wyl-nginx:/etc/nginx nginx

image-20210905000343906

docker inspect 6d4a76d84a35

image-20210905000512455

4.1.3.查看卷信息

docker volume inspect wyl-nginx

image-20210905000602511

4.1.4.改变文件的读写权限

# ro: readonly
# rw: readwrite
# 指定容器对我们挂载出来的内容的读写权限
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:rw nginx

4.2.查看所有的数据卷

docker volume ls

image-20210905001800959

4.3.共享卷

docker run -it --name nginx03 --volumes-from nginx02 nginx:latest

nginx03继承nginx02的volumes

可以验证,在nginx02下加一个数据,在nginx03下也会出现

删除容器共享文件不会删除。

5.dockerFile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

5.1.命令

FROM # 基础镜像 比如centos
MAINTAINER # 镜像是谁写的 姓名+邮箱
RUN # 镜像构建时需要运行的命令
ADD # 添加,比如添加一个tomcat压缩包
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露端口,跟-p一个道理
RUN # 最终要运行的
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,而且可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令
COPY # 将文件拷贝到镜像中
ENV # 构建的时候设置环境变量

image-20210904192846385

5.2.创建centos

5.2.1.创建dockerfile

# 进入home目录
cd /home

# 创建一个目录,之后的东西都保存到这里
mkdir dockerfile
# 进入这个目录
cd dockerfile/
# 创建一个dockerfile,名字叫mydockerfile
vim mydockerfile-centos
FROM centos
MAINTAINER wyl<1714404171@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 8088

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

image-20210904195608613

5.2.2.docker build

cd /home/docerfile
docker build -t mycentos -f mydockerfile-centos .

后面的不要忘记

image-20210904205531218

image-20210904205704837

6.Docker Compose

前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知.对此我们就可以来学习一下docker compose

它是一个用于定义和运行多容器 Docker 的应用程序工具

6.1. compose安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
or
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

image-20210904212608930

pip安装

sudo pip install docker-compose

6.2.权限

sudo chmod +x /usr/local/bin/docker-compose

image-20210904225302027

6.3.Compose 使用

三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。

    FROM java:8
    VOLUME /tmp
    ADD docker-demo.jar app.jar
    RUN bash -c 'touch /app.jar'
    EXPOSE 9000
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
    
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

    Compose和Docker兼容性:
        Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
        目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
    
    常用参数:
        version           # 指定 compose 文件的版本
        services          # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
    
            build                 # 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
                context               # context: 指定 Dockerfile 文件所在的路径
                dockerfile            # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
                args                  # args: Dockerfile 在 build 过程中需要的参数 (等同于 docker container build --build-arg 的作用)
                cache_from            # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
                labels                # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用)
                shm_size              # v3.5中新增的参数, 设置容器 /dev/shm 分区的大小 (等同于 docker container build --shm-size 的作用)
    
            command               # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式
    
            configs               # 
    
            cgroup_parent         # 
    
            container_name        # 指定容器的名称 (等同于 docker run --name 的作用)
    
            credential_spec       # 
    
            deploy                # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm
                endpoint_mode         # v3.3 版本中新增的功能, 指定服务暴露的方式
                    vip                   # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
                    dnsrr                 # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
                labels                # 指定服务的标签,这些标签仅在服务上设置
                mode                  # 指定 deploy 的模式
                    global                # 每个集群节点都只有一个容器
                    replicated            # 用户可以指定集群中容器的数量(默认)
                placement             # 
                replicas              # deploy 的 mode 为 replicated 时, 指定容器副本的数量
                resources             # 资源限制
                    limits                # 设置容器的资源限制
                        cpus: "0.5"           # 设置该容器最多只能使用 50% 的 CPU 
                        memory: 50M           # 设置该容器最多只能使用 50M 的内存空间 
                    reservations          # 设置为容器预留的系统资源(随时可用)
                        cpus: "0.2"           # 为该容器保留 20% 的 CPU
                        memory: 20M           # 为该容器保留 20M 的内存空间
                restart_policy        # 定义容器重启策略, 用于代替 restart 参数
                    condition             # 定义容器重启策略(接受三个参数)
                        none                  # 不尝试重启
                        on-failure            # 只有当容器内部应用程序出现问题才会重启
                        any                   # 无论如何都会尝试重启(默认)
                    delay                 # 尝试重启的间隔时间(默认为 0s)
                    max_attempts          # 尝试重启次数(默认一直尝试重启)
                    window                # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s)
                update_config         # 用于配置滚动更新配置
                    parallelism           # 一次性更新的容器数量
                    delay                 # 更新一组容器之间的间隔时间
                    failure_action        # 定义更新失败的策略
                        continue              # 继续更新
                        rollback              # 回滚更新
                        pause                 # 暂停更新(默认)
                    monitor               # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0)
                    max_failure_ratio     # 回滚期间容忍的失败率(默认值为0)
                    order                 # v3.4 版本中新增的参数, 回滚期间的操作顺序
                        stop-first            #旧任务在启动新任务之前停止(默认)
                        start-first           #首先启动新任务, 并且正在运行的任务暂时重叠
                rollback_config       # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略
                    parallelism           # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚
                    delay                 # 每个组回滚之间的时间间隔(默认为0)
                    failure_action        # 定义回滚失败的策略
                        continue              # 继续回滚
                        pause                 # 暂停回滚
                    monitor               # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0)
                    max_failure_ratio     # 回滚期间容忍的失败率(默认值0)
                    order                 # 回滚期间的操作顺序
                        stop-first            # 旧任务在启动新任务之前停止(默认)
                        start-first           # 首先启动新任务, 并且正在运行的任务暂时重叠
    
                注意:
                    支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子选项
                    security_opt  container_name  devices  tmpfs  stop_signal  links    cgroup_parent
                    network_mode  external_links  restart  build  userns_mode  sysctls
    
            devices               # 指定设备映射列表 (等同于 docker run --device 的作用)
    
            depends_on            # 定义容器启动顺序 (此选项解决了容器之间的依赖关系, 此选项在 v3 版本中 使用 swarm 部署时将忽略该选项)
    
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

    docker-compose up
    docker-compose up -d  // 后台启动并运行容器
    

    6.3.卸载

# pip卸载
pip uninstall docker-compose

6.4.常用命令

image-20210904231917066

7.docker network

默认情况下容器与容器、容器与宿主机的网络是隔离开来的,

当你安装docker的时候,docker会创建一个桥接器docker0,通过它才让容器与容器、容器与宿主机之间通信。

Docker安装的时候默认会创建三个不同的网络,你可以通过命令查看这些网络。

docker network ls

image-20210905204545744

#帮助命令后显示下面信息
[root@vultrguest ~]# docker network --help

Usage:	docker network COMMAND

Manage networks

Options:
      --help   Print usage

Commands:
    connect 将某个容器连接到一个docker网络
    create 创建一个docker局域网络
    disconnect 将某个容器退出某个局域网络
    inspect 显示某个局域网络信息
    ls 显示所有docker局域网络
    prune 删除所有未引用的docker局域网络
    rm 删除docker网络

Run 'docker network COMMAND --help' for more information on a command.

7.1.默认网络

7.1.1.None Network

网络模式为none的,即不会为容器创建任何的网络环境。

一旦Docker Container采用了none网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。

7.1.2.Host Network

如果你在创建容器的时候使用**--network=host选项,那么容器会使用宿主机的网络**,容器与宿主机的网络并没有隔离。

使用这种网络类型的好处就是网络性能很好,基本上跟宿主机的网络一样,它很大的弊端就是不安全

你可以在容器中更改宿主机的网络,如果你的程序是用root用户运行的,有可能会通过Docker容器来控制宿主机的网络。

当我们在容器中执行类似ifconfig命令查看网络环境是,看到的都是宿主机上的信息。

7.1.3.Bridge Network

桥接网络是默认的网络类型,我们可以使用下面的命令来查看默认的网络配置信息。

这儿桥接的网络名为docker0。当我们启动一个容器的时候,每个容器会有它自己的虚拟网络接口连接到docker0,并获得一个IP地址。

image-20210905205007741

7.2.自定义网络

7.2.1创建网络

docker network create mynet

image-20210905205325275

7.2.2.把容器加入局域网

#运行redis容器
docker run -itd --name redis  --network mynet --network-alias redis -p 6379:6379 redis
#运行nginx容器
docker run -d --name nginx -p 8081:8081 --network mynet --network-alias nginx --privileged=true   -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs  nginx

image-20210905205748631

7.2.3.查看mynet 信息

image-20210905205917495

7.2.4.docker network connect

也可以不指定网络,直接启动容器,然后使用docker network connect接入网络

docker network connect mynet nginx
docker network connect mynet redis

7.2.5.移除局域网

docker network disconnect mynet nginx

8.集群