Docker教程:从入门到精通

Docker安装(CentOS)

卸载旧版本Docker

如果之前安装过旧版本的Docker,则可以执行如下命令卸载

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine docker-ce

安装gcc环境

安装gcc环境主要是为了更加顺利的安装Docker环境,在命令行执行如下命令来安装gcc

yum -y install gcc
yum -y install gcc-c++

安装yum工具

在命令行执行如下命令安装yum包管理工具

yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken

设置Docker镜像仓库

将Docker仓库设置为阿里镜像源,执行如下命令

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

执行如下命令将docker-ce.repo镜像仓库配置文件中的镜像源修改为阿里镜像源

sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

更新yum包软件索引

更新yum包软件索引后,执行yum命令安装软件会快一些,在命令行执行如下命令更新yum包软件索引。

yum makecache fast

安装Docker

在命令行执行如下命令安装Docker

yum -y install docker-ce docker-ce-cli containerd.io

启动Docker

在命令行执行如下命令启动Docker

systemctl start docker

设置Docker开机自启动

在命令行执行如下命令设置Docker开机自启动

systemctl enable docker

查看Docker版本

在命令行输入如下命令查看Docker版本

docker version

输出的结果信息如下所示

Client: Docker Engine - Community
 Version:           26.0.0
 API version:       1.45
 Go version:        go1.21.8
 Git commit:        2ae903e
 Built:             Wed Mar 20 15:21:09 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.0.0
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.8
  Git commit:       8b79278
  Built:            Wed Mar 20 15:20:06 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

配置镜像加速

直接复制一下命令执行即可

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

Docker常见命令

systemctl daemon-reload//重载系统服务
systemct1 1ist-unit-files-type service//查看全部服务命令
systemct1 status docker//查看docker服务状态
systemct1 enable docker/设置docker开机自启动
systemct1 disable docker//关闭docker开机启动
systemct1 start docker//启动docker服务
systemctl stop docker//停止docker服务
systemctl restart docker//重启docker服务

Docker常用命令

帮助启动类

  1. 帮助命令

    docker --help  # 帮助文档
    
    docker run --help
    
  2. 关于Docker启停等命令

systemctl daemon-reload//重载系统服务
systemct1 1ist-unit-files-type service//查看全部服务命令
systemct1 status docker//查看docker服务状态
systemct1 enable docker/设置docker开机自启动
systemct1 disable docker//关闭docker开机启动
systemct1 start docker//启动docker服务
systemctl stop docker//停止docker服务
systemctl restart docker//重启docker服务

镜像命令

  1. docker images:列出主机上所有的镜像

    常用参数说明:

    -a: 列出本地所有镜像(含历史镜像)

  2. -q: 只显示镜像ID

各个选项的说明:REPOSITORY:表示镜像的仓库源TAG:镜像的标签版本号 IMAGE ID:镜像ID CREATED:镜像创建时间 SZIE:镜像大小

3. docker search: 搜索某个镜像是否在远程仓库

4. docker pull: 在远程仓库拉取某个镜像

    docker pull [name]:tag 默认为latest

    --limit N 表示只显示前几个镜像

5. docker system df : 查看镜像/容器/数据卷所占的空间

6. docker rmi 某个镜像的ID: 删除某个镜像

    -f: 强制删除某个镜像

    删除多个: docker rmi -f 镜像名1:TAG 镜像名2:TAG  或 [IMAGE ID ...]

    删除全部: docker rmi -f $(docker images -qa)

    面试题:谈谈docker的虚悬镜像

    • 是什么:仓库名、标签都是<none>的镜像,俗称虚悬镜像dang ling image

容器命令

  1. 新建 + 启动容器

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

    --name="容器新名字"-d: 后台运行容器并返回容器ID,即启动守护式容器-i: 以交互式模式运行容器,通常与-t同时使用-t: 为容器重新分配一个伪终端,通常与 -i 使用;交互式容器-P: 随机端口映射, 大写P-p: 指定端口映射, 小写p启动交互式容器[前台命令行]: docker run -it ubuntu /bin/bash
  2. docker ps: 罗列出所有正在运行的实例

    -a: 列出所有正在运行的容器 + 历史上运行过的

    -l: 显示最近创建的容器

    -n: 显示最近n个创建的容器

    -q: 静默模式,只显示容器编号

  3. 退出容器

    1. exit: run 进容器,exit退出,容器停止
    2. ctrl + p + q: run 进去容器, ctrl + p + q 退出,容器不停止
  4. 容器的启动停止等操作

    1. docker start 容器ID或者容器名: 启动已停止运行的容器
    2. docker restart 容器ID或者容器名: 重启容器
    3. docker stop 容器ID或者容器名: 停止容器
    4. docker kill 容器ID或者容器名: 强制停止容器
    5. docker rm 容器ID或者容器名: 删除已经停止的容器 -f: 强制删除
    6. docker rm $(docker ps -aq):一次性删除多个已停止的容器
    7. docker ps -a -q | xargs docker rm: 一次性删除多个容器  xargs:Linux的可变参数[前面的结果作为参数传给后面]
  5. 启动守护式容器

    大部分场景下我们希望docker容器都是在后台运行,我们可以使用 -d 指定容器的后台运行模式

    • docker run -d --name:"容器名字" 容器名字:tag
  6. docker logs 容器ID: 查看容器日志

  7. docker top 容器ID: 查看容器内运行进程

  8. docker inspect 容器ID

  9. 重新进入容器并以命令行交互

    docker exec -it 容器ID /bin/bash:重新进入到启动的容器

    docker attach 容器ID也可以实现进入容器

    二者的区别

    attach 直接进入容器命令终端,不会启动新的进程 用 exit 退出,会导致容器停止

    exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器停止

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

    docker cp 容器ID:容器内路径 目的主机路径

  11. 导入和导出容器

    导出:docker export 容器ID > 导出主机目录+文件名

    导入:cat 文件名.tar.gz | docker import - 镜像用户/镜像名:镜像版本号

Docker镜像

UnionFS(联合文件系统)

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件趸统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来

Docker镜像加载的原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。bootfs(boot file system)主要包含bootloader和kernel,,bootloader主要是引导加载kernel,.Linux刚启动时会加载pootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix.系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

注意:Docker镜像层都是只读的,容器层是可写的

Docker镜像的commit命令

案例:

ubuntu安装vim

docker run -it ubuntu /bin/bash

apt-get update
# 下载Vim
apt-get install -y vim

docker commit -m="Add vim" -a="XiaoHao" e556d80dd0a1 chen/myubuntu:1.1

commit 提交镜像:docker commit -m="提交的信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

Docker容器卷

坑:在Docker容器挂在目录时需要加一个参数 --privileged=true 参数

参数 -v :设置挂在数据卷的目录在主机中实现数据的持久化

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

数据卷的添加

  • 公式:docker run -it -v /宿主机目录:/容器内目录 镜像名
  • 读写规则说明:
    • 读写(默认): rw
    • 只读: ro
  • 卷的继承和共享
    • 容器1与宿主机共享:docker run -it --privileged=true -v /tmp/host_data:/tmp/u --name u1 ubuntu
    • 容器2继承容器1和宿主机的卷规则:docker run -it --privileged=true --volumes-from 父类  --name u2 ubuntu
    • 每一个容器之间互不影响,只是继承父类的数据卷挂载规则

Docker安装常用软件

安装步骤

  1. 搜索镜像
  2. 拉取镜像
  3. 查看镜像
  4. 启动镜像
    1. 服务端口的映射以及数据卷的挂载
  5. 停止容器
  6. 移除容器

Tomcat安装

安装Tomcat按照以下命令安装

# 拉取镜像
docker pull tomcat

# 查看镜像是否被拉取到本地
docker images

# 启动镜像并指定端口
docker run -d -p 8080:8080 --name t1 tomcat

启动之后访问tomcat会出现404,解决办法:

  1. 执行 rm -r webapps 命令,删除 webapps 目录
  2. 执行 mv webapps.dist webapps命令
  3. 再次访问即可成功访问

下载免修改版 Tomcat

在命令行执行如下命令

docker run -d -p 8080:8080 --name tomcat8 billygoo/tomcat8-jdk8

安装MySQL

安装MySQL按照以下命令在命令行执行

拉取镜像

拉取MySQL镜像在命令行执行如下命令

docker pull mysql:5.7

实战版启动MySQL

docker run -d -p 3306:3306 --privileged=true \
-v /usr/local/mysql/log:/var/log/mysql \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql mysql:5.7

  • -p: 映射主机与容器之间的端口
  • --privileged=true: 修改容器权限
  • -v: 挂载数据卷,把MySQL的数据、日志和配置都挂载到主机上
  • -e: MySQL的密码

新建my.cnf: 通过容器数据卷同步给mysql容器实例——解决中文乱码问题

修改配置文件my.cnf

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

改完配置文件重启mysql

docker restart mysql

再次进入mysql容器

docker exec -it 容器ID /bin/bash

登录mysql查看字符集编码

mysql -uroot -p密码

# 在容器内执行
show variables like 'character%';

# 结果如下
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

安装Redis

拉取镜像

docker pull redis:6.2.6

启动Redis

docker run -p 6379:6379 --name redis --privileged=true \
-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis/data:/data \
-d redis:6.2.6 redis-server /etc/redis/redis.conf 

安装minio

使用如下命令安装:

docker pull bitnami/minio


docker run \
> -p 9000:9000 \
> -p 9001:9001 \
> --name minio \
> -d \
> --restart=always \
> -e "MINIO_ROOT_USER=root" \
> -e "MINIO_ROOT_PASSWORD=32345678" \
> -v /usr/local/soft/minio/data:/data \
> -v /usr/local/soft/minio/config:/root/.minio \
> minio/minio \
> server \
> /data \
> --console-address ":9000" \
> --address ":9001"

DockerFile

是什么

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

构建三步骤:

  • 编写Dockerfile文件
  • docker build命令构建镜像
  • docker run依镜像运行容器实例

DockerFile构建过程解析

DockerFile基础知识

  1. 每条保留字指令都必须为大写且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

DockerFile的大致执行流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commitl的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

DockerFile保留字介绍

  • FROM: 基础镜像—制定一个已经存在的镜像作为模版(第一条必须为FROM)

  • MAINTAINER: 镜像维护作者的名字

  • RUN: 容器构建时需要运行的命令—在docker build时运行

    • shell格式
    • exec格式
  • EXPOSE: 当前容器对外暴露的端口

  • WORKDIR: 指定在创建容器后,终端默认登录的进来工作的目录,一个落脚点

  • USER: 指定该用户以什么样的用户去执行,不指定默认为root

  • ENV: 用来在构建镜像中设置环境变量

  • ADD: 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

  • COPY:

    image-20240404183320569
  • VOLUME: 容器卷,用于数据保存和持久化工作

  • CMD: 指定容器启动后要干的事情

    • 多个CMD参数,只有最后一个生效,CMD会被docker run 之后的参数替换
    • RUN是在docker build 时运行
    • CMD是在docker run 时运行
  • ENTRYPOINT: 指定一个容器运行时要运行的命令

    • ENTRYPOINT不会被docker run 后面的命令覆盖,而是会把这些参数送给指定的ENTRYPOINT指令指定的程序
    • 优点: 在执行docker run的时候可以指定ENTRYPOINT运行所需的参数。
    • 注意: 如果Dockerfile中如果存在多个ENTRYPOINT指令,仅最后一个生效。

案例实战

DockerFile构建镜像:CentOS镜像具备vim + ifconfig + jdk8

  1. 编写准备DockerFile文件——大写字母D

    FROM centos:7.9.2009
    MAINTAINER xiaohao<xiaohao@126.com>
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    #安装vim编辑器
    RUN yum -y install vim
    #安装ifconfig命令查看网络IP
    RUN yum -y install net-tools
    #安装java8及lib库
    RUN yum -y install glibc.i686
    RUN mkdir /usr/local/java
    #ADD 是相对路径jar,把jdk-8u391-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
    ADD jdk-8u391-linux-x64.tar.gz /usr/local/java/
    #配置java环境变量
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_391
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    ENV PATH $JAVA_HOME/bin:$PATH
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "success--------------ok"
    CMD /bin/bash
    
  2. 构建镜像

    docker build -t 新镜像的名字:tag .

  3. 运行新镜像

    docker run -it 新镜像名字:tag

虚悬镜像

  1. 是什么:仓库名、标签都是<none>的镜像
  2. 查看:docker images ls -f dangling=true
  3. 删除:docker image prune

Docker-compose容器编排

Docker-compose是Docker官方开源项目负责实现对Docker容器集群的快速编排

安装Docker-compose

下载docker-compose

使用如下命令下载docker-compose

curl -SL https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

修改文件的执行权限

使用如下命令:

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

创建软连接

使用如下命令:

In -s /usr/local/bin/docker-compose /usr/bin/docker-compose

查看docker-compose版本

使用如下命令查看版本信息

docker-compose --version

卸载docker-compose

使用如下命令卸载:

rm /usr/local/bin/docker-compose

Compose核心概念

一个文件:docker-compose.yml

两要素

  • 服务:一个应用容器实例
  • 工程:由一组关联的容器组成的一个完整的业务单元,在docker-compose.yml文件中管理

Compose使用三步骤

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  2. 使用docker-compose.yml定义一个完整的服务单元,安排好整体应用中的各个容器服务
  3. 执行docker-compose up命令来启动并运行整个应用程序,完成一键部署

Compose常用命令

Compose常用命令:

#查看帮助docker-compose -h#启动所有docker--compose服务                     docker-compose up       #启动所有docker-compose服务并后台运行              docker-compose up -d     #停止并删除容器、网络、卷、镜像。             docker-compose down      #进入容器实例内部docker-compose exec docker-compose.yml文件中写的服务id /bin/bashdocker-compose exec yml里面的服务id #展示当前docker-compose编排过的运行的所有容器   docker-compose ps #展示当前docker-compose编排过的容器进程                    docker-compose top #查看容器输出日志                   docker-compose logs yml里面的服务id  #检查配置  dokcer-compose config  #检查配置,有间题才有输出               dokcer-compose config -q  # 重启服务                           docker-compose restart# 启动服务                                                               docker-compose start# 停止服务                                                                                 docker-compose stop                        
发布微服务到docker

编写Dockerfile文件

#基础镜像使用java
FROM java:8
#作者
MAINTAINER chen
#VOLUME指定临时文件目录为/tmp,在主机var/lib/docker目录下创建了一个临时文件并链接到容器的tmp
VOLUME /tmp
#将jar包添加到容器中并更名为app_docker..jar
ADD docker boot-0.0.1-SNAPSHOT.jar app_docker.jar
#运行jar包
RUN bash -c 'touch /app_docker.jar
ENTRYPOINT ["java","-jar","/chen_docker.jar"]

#暴露6001端口作为微服务
EXPOSE 6001

构建镜像

docker build -t app_docker:1.6 .

编写docker-compose.yml文件

version: "3"
 
services: 
  microService:
    image: chen_docker:1.6
    container_name: ms01
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
    networks: 
      - app_net 
    depends_on: 
      - redis
      - mysql
 
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - app_net
    command: redis-server /etc/redis/redis.conf
 
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db2021'
      MYSQL_USER: 'chen'
      MYSQL_PASSWORD: 'chen123'
    ports:
       - "3306:3306"
    volumes:
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - app_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
 
networks: 
   app_net: 

修改yml文件:把之前使用的固定ip地址修改为服务

Portainer可视化工具

Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环镜。

安装Portainer工具

执行如下命令进行安装:

docker run -d -p 8000:8000 -p 9000:9000 --name portainer     --restart=always     -v /var/run/docker.sock:/var/run/docker.sock     -v portainer_data:/data  portainer/portainer

安装完成之后通过浏览器输入地址http://localhost:9000即可访问,首次访问需要设置用户名和密码

image-20240719165658666
 

 

 

阅读剩余
THE END