一、入门&简介
- Docker可以让开发者打包他们的应用以及依赖包到一个轻量、可移植的容器中,然后发布到任何可流行的Linux机器上。
- 容器时完全使用沙箱机制,项目隔离(Docker里有多个容器,每个容器之间相互隔离,互不影响)。
- 容器性能开销极低。
- 从17.03后分为CE(Community)社区版和EE(Enterprise)企业版。
- 总结:Docker是一种容器技术,用于解决跨环境软件迁移问题。
(一)安装
- 配置阿里云yum源,详情可看:配置yum源
- 更新yum包为最新
yum update
- 配置阿里云的Docker yum源&安装所需软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 查看yum安装包中Docker的版本
yum list docker-ce --showduplicates
- 安装Docker(自动选择最新版)
yum install docker-ce -y
- 验证是否安装成功
docker -v
- 启动Docker
systemctl enable docker
systemctl start docker
(二)Docker架构
(三)Docker镜像加速器
因为Docker的官方镜像在国外,所以拉取镜像很慢,这时就需要一个国内的镜像源来代替。
阿里云镜像加速教程
补充:阿里云不能用了,其他通过github的镜像加速
# 写入镜像配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
# 重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
二、Docker命令
(一)daemon命令(开启关闭Docker等)
- 启动docker
systemctl start docker
,查看docker状态、重启等命令类似(使用systemctl)。 - 清理docker数据
docker system prune
,用于清理没有使用的数据,包括镜像数据,已经停止的容器。 - 查看某个容器日志
docker logs 容器ID/容器名
-f
:显示实时log(和Linux的tail -f作用类似)
--tail 20
:查看日志最后20行
eg:docker logs -f -t -n=5 容器名
,-f
实时跟踪,-t
显示时间戳,-n=5
显示最后5行
(二)image命令
-
查看本地镜像
docker images
-
搜索远程镜像
docker search redis
-
拉取远程镜像
不指定版本号,默认lates:docker pull redis
指定版本号:docker pull redis:3.2
查看有哪些版本:进入docker hub官网>>搜索镜像名>>点进去可以查看该镜像都有哪些版本。
视频教程 -
删除本地镜像
通过IMAGE ID删除:docker rmi image的ID
通过镜像名删除:docker rmi redis
(如果有多个版本,可以指定删除版本docker rmi redis:5.0
)
一次性删除所有镜像:
(三)container命令(重点)
-
查看容器
docker ps
A. 不加参数:查看正在运行的容器
B.-a
查看所有容器(包括running的、exited的) -
创建容器
A.
docker run -it --name=redisTest redis:5.0
(交互式容器,exit退出后容器关闭)
-i
:保持容器运行,exit后容器自动关闭
-t
:为容器分配一个伪终端,通常与-i连用
-name
:指定容器name
redis:5.0:该容器的镜像及版本
B.
docker run -id --name=redisTest redis:5.0
(守护式容器,退出后容器不会关闭)
-d
:后台运行创建容器(命令完成后不会自动进入容器,需要命令进入,当使用exit
退出容器时并不会关闭容器的运行) -
进入容器
docker exec -it 容器名 /bin/bash
-
启动容器
docker start 容器名
-
停止容器
docker stop 容器名
-
删除容器
docker rm 容器ID/容器名
(running的容器无法删除)
删除所有容器: -
查看容器详细信息
docker inspect 容器名
-
开启容器自启动
docker update --restart=always 容器名
-
关闭容器自启动
docker update --restart=no 容器名
-
案例分析:
创建容器时,我将容器内的目录挂载到了宿主机名为es-plugins
的目录下,现在如何找到这个es-plugins
在哪个具体的路径下?
A. 先查询容器都挂载了哪些数据卷,docker inspect es
B. 查看某文件具体在宿主机的哪个路径,docker volume inspect es-plugins
三、Docker数据卷
(一)概念&作用
两个容器之间通信:
- 两个容器启动时都挂载同一个目录,这样读取目录文件即可实现通信。
- 通过数据卷容器实现。
(二)配置数据卷
挂载多个目录:
(三)配置数据卷容器
配置数据卷命令:
(五)数据卷相关命令
- 查看宿主机都有哪些数据卷
docker volume ls
- 查看某个数据卷的详细信息
docker volume inspect es
四、Docker应用部署
常见步骤:
- 搜索镜像
- 拉取镜像
- 创建容器
(一)MySQL部署
略
Docker安装MySQL 8.0并挂载数据及配置文件
高版本Mysql使用Navicat连接错误解决
(二)Nginx部署
(三)Nacos部署
注意::Nacos好像需要Mysql的支持,先run Mysql再装nacos(其中mysql高版本连接会出错,解决办法见上面)
(四)FTP部署
- pull镜像
docker pull fauria/vsftpd
- 创建容器
docker run -d -p 2121:21 -p 2020:20 -p 21100-21110:21100-21110 \
-v /home/dispatch/ftp/root:/home/vsftpd/ftp \
-e FTP_USER=ftp \
-e FTP_PASS=admin@123.com \
-e PASV_ADDRESS=192.168.32.50 \
-e PASV_MIN_PORT=21100 \
-e PASV_MAX_PORT=21110 \
--name vsftpd \
--restart=always fauria/vsftpd
2121:21
将Docker的21端口暴露到宿主机的2121端口上,2020:20
端口同理。
用户名ftp
,密码admin@123.com
。
PASV_ADDRESS
为宿主机IP。
-v挂载时,右边docker挂载目录格式如下/home/vsftpd/${设置的ftp的账户名}
,这里我的FTP_USER=ftp
,所以路径是/home/vsftpd/ftp
。
五、Dockerfile
(一)Docker镜像原理
(二)容器转为镜像
因为内容不会跟随镜像,所有更常用的是dockerfile的形式。
(三)dockerfile概念及作用
(四)使用dockerfile部署springboot项目
(五)示例
FROM java:8
ARG runEnvArg
ARG nacosUrlArg
ARG registerIpArg
ENV runEnvEnv $runEnvArg
ENV nacosUrlEnv $nacosUrlArg
ENV registerIpEnv $registerIpArg
VOLUME /tmp
COPY hisi-pex-db-operation-1.0.0.jar hisi-pex-db-operation-1.0.0.jar
RUN bash -c "touch /hisi-pex-db-operation-1.0.0.jar"
EXPOSE 9250
ENTRYPOINT ["java","-jar","-DregisterIp=${registerIpEnv}","-DrunEnv=${runEnvEnv}","-DnacosUrl=${nacosUrlEnv}","hisi-pex-db-operation-1.0.0.jar"]
FROM
:
- 指定基础镜像,当前应用是基于JAVA的应用,所以FROM java:8,相当于将java作为基础镜像,在该镜像上做个性化镜像。
COPE
:
- 从上下文目录中复制文件或者目录到容器里指定路径。
- 上下文目录,默认上下文路径就是 Dockerfile 所在的位置。
- 上述例子表示,将Dockerfile所在位置的jar包复制到容器中(默认容器根目录)。
六、Docker Compose
DockerCompose和Dockerfile区别
Dockerfile 记录单个镜像的构建过程, docker-compse.yml 记录一个项目(project, 一般是多个镜像)的构建过程。
你说有些教程用了 dockerfile+docker-compose, 是因为 docker-compose.yml 本身没有镜像构建的信息,如果镜像是从 docker registry 拉取下来的,那么 Dockerfile 就不需要;如果镜像是需要 build 的,那就需要提供 Dockerfile。
docker-compose配合Dockerfile使用
服务编排简介:
Docker Compose就是一个实现了服务编排的工具:
Docker Compose安装使用:
- 下载docker-compose,将v2.2.2替换为你想要的版本。
curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
如果在线下载很慢,可以访问github挂代理下载
uname - s获取当前操作系统名称 uname -m获取当前操作系统架构
- 如果是使用curl在线下载,忽略第3、4步。
- 检查下载的文件名是否为
docker-compose
,不是请用mv
改名。 - 将下载的 Docker Compose 安装文件移动到 /usr/local/bin/ 目录下,这样它就可以在系统的 PATH 中被找到。
mv docker-compose /usr/local/bin/
- 授予 Docker Compose 二进制文件执行权限。
chmod +x /usr/local/bin/docker-compose
- 验证安装是否成功。
docker-compose --version
七、Docker Network
(一)四种网络模式
docker 安装好之后默认会创建三个虚拟网卡,可以使用 docker network ls 命令来查看,三个虚拟网卡和 VMware 的类似。默认三个虚拟网卡的IP 地址会随着容器的启动停止而变动。
b@ubuntu20:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
68633255abb2 bridge bridge local
adea9d9ae839 host host local
517ed92475cc none null local
- bridge 是默认的网卡,网络驱动是 bridge 模式,类似于 Vmware 的 NAT 模式,如果容器启动时不指定网卡,则会默认连接到这块网卡上。如果需要访问容器内部的端口需要设置端口映射。并且默认的bridge网卡内部,各个容器之间不能通过容器名来访问(理由下面讲)。
- host 是直接使用主机的网络,网络驱动是 host 模式,类似于 Vmware 的桥接模式,可能会和主机的端口存在冲突,不需要设置端口映射即可连接到容器端口。
- none 禁止所有联网,没有网络驱动,一般情况下用不到。
着重看一下自定义网络:
- 创建的自定义网络,默认是bridge模式。
- 如果在创建容器时没有使用-p设置端口映射,那么外部是访问不到docker内创建的容器的,但是同一个网络内的各个容器是可以互相访问的,并且可以通过容器名进行通信。
- 同一个自定义网络下,容器内部使用
localhost
或127.0.0.1
代表的是该容器的回环地址(也就是这个容器本身),而不是代表的宿主机。
默认网络和自定义网络区别
说到这里可能有人会问了,那默认的网卡的网卡驱动也是 bridge 模式的,用户自定义的网络也是 bridge 模式,不就是换了一个名字吗,为什么默认的网卡不可以使用别名进行 IP 地址解析呢?
官方解释的默认bridge网卡和自定义bridge网卡的区别:
User-defined bridges provide automatic DNS resolution between containers.
Containers on the default bridge network can only access each other by IP addresses, unless you use the --link option, which is considered legacy. On a user-defined bridge network, containers can resolve each other by name or alias.
简单来说就是:用户自定义的网卡可以在容器之间提供自动的 DNS 解析,缺省的桥接网络上的容器只能通过 IP 地址互相访问,除非使用 --link 参数。在用户自定义的网卡上,容器直接可以通过名称或者别名相互解析。
(二)Network命令
docker network connect参考文章1
docker network详解
- 查看当前网络列表
docker network list
- 查看网络列表里某个网络详细信息
docker network inspect bridge
[root@localhost ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
- connect:连接一个容器到指定网络
- create:创建一个container模式的网络
- disconnect:将某个容器从指定网络移除
- inspect:查看某个网络详细信息
- ls:查看当前网络列表(list的缩写)
- prune:删除所有未使用的网络
- rm:删除某个网络
示例如下:
- 将mysql容器连接到bridge网络
docker network connect bridge mysql
连接时给容器一个指定的ip
docker network connect --ip 192.168.32.100 bridge mysql
注意: connect是为容器新增一张指定网络的网卡,而不是将本有的网络移动为其他网络。
(当使用run创建一个容器时,不指定就默认是bridge网络,这时使用connect容器就会新增一张网卡连接到指定网络,但是该容器还在bridge网络中) - 创建一个网络
docker network create mynetwork
- 将mysql容器从bridge网络移除
docker network disconnnect bridge mysql
- 查看bridge网络详细信息
docker network inspect bridge
- 删除自建的mynetwork网络
docker network rm mynetwork
- 测试容器之间网络是否互通
使用docker exec -it redis /bin/bash
进入容器后,使用ping nginx
测试