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常用命令
帮助启动类
-
帮助命令
docker --help # 帮助文档 docker run --help
-
关于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 images:列出主机上所有的镜像
常用参数说明:
-a: 列出本地所有镜像(含历史镜像)
-
-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
-
容器命令
-
新建 + 启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
--name="容器新名字"
-d: 后台运行容器并返回容器ID,即启动守护式容器
-i: 以交互式模式运行容器,通常与-t同时使用
-t: 为容器重新分配一个伪终端,通常与 -i 使用;交互式容器
-P: 随机端口映射, 大写P
-p: 指定端口映射, 小写p
启动交互式容器[前台命令行]: docker run -it ubuntu /bin/bash
-
docker ps: 罗列出所有正在运行的实例
-a: 列出所有正在运行的容器 + 历史上运行过的
-l: 显示最近创建的容器
-n: 显示最近n个创建的容器
-q: 静默模式,只显示容器编号
-
退出容器
-
exit: run 进容器,exit退出,容器停止 -
ctrl + p + q: run 进去容器, ctrl + p + q 退出,容器不停止
-
-
容器的启动停止等操作
-
docker start 容器ID或者容器名: 启动已停止运行的容器 -
docker restart 容器ID或者容器名: 重启容器 -
docker stop 容器ID或者容器名: 停止容器 -
docker kill 容器ID或者容器名: 强制停止容器 -
docker rm 容器ID或者容器名: 删除已经停止的容器 -f: 强制删除 -
docker rm $(docker ps -aq):一次性删除多个已停止的容器 -
docker ps -a -q | xargs docker rm: 一次性删除多个容器 xargs:Linux的可变参数[前面的结果作为参数传给后面]
-
-
启动守护式容器
大部分场景下我们希望docker容器都是在后台运行,我们可以使用 -d 指定容器的后台运行模式
-
docker run -d --name:"容器名字" 容器名字:tag
-
-
docker logs 容器ID: 查看容器日志
-
docker top 容器ID: 查看容器内运行进程
-
docker inspect 容器ID
-
重新进入容器并以命令行交互
docker exec -it 容器ID /bin/bash:重新进入到启动的容器
docker attach 容器ID也可以实现进入容器
二者的区别:
attach 直接进入容器命令终端,不会启动新的进程 用 exit 退出,会导致容器停止
exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器停止
-
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
-
导入和导出容器
导出: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 :设置挂在数据卷的目录在主机中实现数据的持久化
特点:
-
数据卷可在容器之间共享或重用数据 -
卷中更改可以直接生效 -
数据卷中的更改不会包含在镜像的更新中 -
数据卷的生命周期一直持续到没有容器使用它为止
数据卷的添加
-
公式: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安装常用软件
安装步骤
-
搜索镜像 -
拉取镜像 -
查看镜像 -
启动镜像 -
服务端口的映射以及数据卷的挂载
-
-
停止容器 -
移除容器
Tomcat安装
安装Tomcat按照以下命令安装
# 拉取镜像
docker pull tomcat
# 查看镜像是否被拉取到本地
docker images
# 启动镜像并指定端口
docker run -d -p 8080:8080 --name t1 tomcat
启动之后访问tomcat会出现404,解决办法:
-
执行 rm -r webapps 命令,删除 webapps 目录 -
执行 mv webapps.dist webapps命令 -
再次访问即可成功访问
下载免修改版 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基础知识
-
每条保留字指令都必须为大写且后面要跟随至少一个参数 -
指令按照从上到下,顺序执行 -
#表示注释 -
每条指令都会创建一个新的镜像层并对镜像进行提交
DockerFile的大致执行流程
-
docker从基础镜像运行一个容器 -
执行一条指令并对容器作出修改 -
执行类似docker commitl的操作提交一个新的镜像层 -
docker再基于刚提交的镜像运行一个新容器 -
执行dockerfile中的下一条指令直到所有指令都执行完成
DockerFile保留字介绍
-
FROM: 基础镜像—制定一个已经存在的镜像作为模版(第一条必须为FROM)
-
MAINTAINER: 镜像维护作者的名字
-
RUN: 容器构建时需要运行的命令—在docker build时运行
-
shell格式 -
exec格式
-
-
EXPOSE: 当前容器对外暴露的端口
-
WORKDIR: 指定在创建容器后,终端默认登录的进来工作的目录,一个落脚点
-
USER: 指定该用户以什么样的用户去执行,不指定默认为root
-
ENV: 用来在构建镜像中设置环境变量
-
ADD: 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
-
COPY:
-
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
-
编写准备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
-
构建镜像
docker build -t 新镜像的名字:tag .
-
运行新镜像
docker run -it 新镜像名字:tag
虚悬镜像
-
是什么:仓库名、标签都是<none>的镜像 -
查看:docker images ls -f dangling=true -
删除: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使用三步骤
-
编写Dockerfile定义各个微服务应用并构建出对应的镜像文件 -
使用docker-compose.yml定义一个完整的服务单元,安排好整体应用中的各个容器服务 -
执行docker-compose up命令来启动并运行整个应用程序,完成一键部署
Compose常用命令
Compose常用命令:
docker-compose -h
docker-compose up
docker-compose up -d
docker-compose down
docker-compose exec yml里面的服务id
docker-compose ps
docker-compose top
docker-compose logs yml里面的服务id
dokcer-compose config
dokcer-compose config -q
docker-compose restart
docker-compose start
docker-compose stop
编写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即可访问,首次访问需要设置用户名和密码