1.为什么要用到docker?
在我们实际业务中,原生技术的微服务的部署十分麻烦,例如我们安装redis,Ubuntu和Centos的命令也有差异,安装MySQL,不同操作系统和环境底层的函数库和依赖可能会有差异,导致实际部署时问题千奇百怪,由此docker就是来解决这样的问题的
docker可以把各个组件所依赖的函数库等一并打包为镜像,方便各个组件和微服务的部署
2.安装docker
2.1卸载旧版本
如果安装过旧版本的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
2.2安装docker
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
更新本地镜像源
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
输入命令安装docker-ce社区免费版本
yum install -y docker-ce
2.3启动docker
docker在使用时需要配置到多个端口,如果你项目在开发阶段,不是部署到服务器,而是本机,那么我建议你关闭防火墙,如果你需要发布到云服务器上,那么一定要记住你用到的端口,开放你需要的端口,否则无法访问
关闭防火墙:
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
命令启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
查看版本:
docker -v
2.4配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors.
2.4.1 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档 docker-ce
2.4.2 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://iu4pcpiy.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3.Centos7安装DockerCompose
DockerCompose可以帮助我们快速部署分布式应用,无需一个个微服务去构建镜像和部署。
3.1下载
Linux可通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
3.2修改文件权限
# 修改权限
chmod +x /usr/local/bin/docker-compose
4.Docker镜像仓库
众所周知,dockerHub也是一个镜像仓库,但是如果我们公司或者团队内,不可能把自己制作的镜像上传到公共的平台吧?所以,我们需要一个私有仓库,如何搭建一个私有仓库,这节就教大家
4.1基础仓库
输入如下命令:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
4.2图形化界面仓库
输入命令:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=(你想要的仓库名字)
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
4.3配置信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置,客户端上传(push)时,如果不配置信任,就会被拦截,所以我们需要做一些修改
# 打开要修改的文件
vi /etc/docker/daemon.json
然后在原有的字段后,根据json语法,加个逗号和回车,输入:
# 添加内容:
"insecure-registries":["http://xxx.xxx.xxx.xxx(上传被信任的客户机ip或者域名):8080"]
重新加载:
# 重加载
systemctl daemon-reload
重启docker
# 重启docker
systemctl restart docker
5.docker常用命令
5.1镜像操作
5.1.1拉取镜像
去镜像仓库(DockerHub)拉取一个nginx,如果nginx后不加版本号默认最新的。
docker pull nginx #nginx就是拉取的镜像名称
5.1.2查看镜像
docker imgages
5.1.3保存镜像
有时候我们想通过物理介质拷贝给队友,需要将镜像拷贝一份,我们可以保存为一个tar.gz文件
docker save -o [保存的目标文件夹名字] [镜像名称]
5.1.4删除镜像
docker rmi [镜像名称]
5.1.5导入加载镜像
我们导入别人的tar.gz镜像文件,命令如下
docker load -i [tar镜像打包文件]
5.2容器操作
镜像可以创建一个容器
5.2.1创建并运行容器
例如:创建并运行nginx容器的命令:
docker run --name [containerName(容器名)] -p 80:80 -d nginx
命令解读:
- docker run :创建并运行一个容器
- –name : 给容器起一个名字,比如叫做mn
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx
5.2.2进入容器,修改文件
docker exec -it [容器名] bash
命令解读:
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
5.2.3查看容器日志
正常看日志:
docker logs
如果要持续追踪日志,查看日志变化需要加入 -f 参数
5.2.4查看容器状态
查看正在运行的容器
docker ps
查看所有的容器
docker ps -a
5.2.5暂停,停止,重启,删除一个容器
- docker pause:让一个运行的容器暂停
- docker unpause:让一个容器从暂停状态恢复运行
- docker stop:停止一个运行的容器
- docker start:让一个停止的容器再次运行
- docker rm:删除一个容器
5.3数据卷操作命令
5.3.1创建和查看数据卷
docker volume create [创建名字]
5.3.2查看所有数据
docker volume ls
5.3.3查看数据卷详细信息
docker volume inspect [数据卷名字]
得到如下数据
{
"CreatedAt": "2021-11-21T19:19:15+08:00",
"Driver": "local",
"Labels": { },
"Mountpoint": "/var/lib/docker/volumes/html/_data",
"Name": "html",
"Options": { },
"Scope": "local"
}
name就是数据卷名字,Mountpoint就是关联的宿主机目录
5.3.4删除数据卷
删除指定数据卷
docker volume rm [数据卷名字]
删除所有未使用的数据卷
docker volume prune
5.3.5挂载数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
这里的-v就是挂载数据卷的命令:
-v html:/root/html:把html数据卷挂载到容器内的/root/html这个目录中
例如我们想修改容器中的文件,我们可以创建一个卷,挂载到容器中,这样我们就可以使用真实操作系统中的高级编辑工具编辑文件了
6.Dockerfile语法
构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
而描述上述信息的文件就是Dockerfile文件。
Dockerfile文件其实就是一个个命令的集合,可以理解为shell脚本文件,按顺序执行命令
详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
目录如下:
- 实例代码如下:1.
# 指定基础镜像,可以理解为拿到ubuntu的底层函数和依赖等
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录,配置镜像中的java环境变量
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包,第一行代表将当前目录的jdk8.tar.gz拷贝到镜像中的/usr/local下
# $JAVA_DIR就是上面配置的环境变量,$是取环境变量的意思
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK,先cd进工作目录,再解压,移动
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
- 进入Dockerfile所在目录
- 运行命令
docker build -t javaweb(容器自定义的名字):1.0 (容器自定义的版本)
- 访问docker-demo项目,本项目是个springboot项目,所以访问时可以通过如下地址
http://xxx.xxx.xxx.xxx:8090/hello/count
有一个更加简便的方法,基于java:8-alpine镜像,配置jdk等繁琐的步骤都可以省略,可以快速将java项目做为镜像
上述实例代码就可改成这样
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar
7.Docker-Compose
7.1示例
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
例如我有如下的项目需要发布:
gateway文件夹(其他文件类似):
services:
#service下二级目录,代表有名叫:nacos,mysql,userservice,orderservice,gateway五个容器需要部署
nacos:
# 去拉取nacos/nacos-server的镜像
image: nacos/nacos-server
# 单例启动
environment:
MODE: standalone
# 端口匹配为8848
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
# 数据库密码为123
environment:
MYSQL_ROOT_PASSWORD: 123
# 挂载目录是($PWD代表当前路径)宿主机的$PWD/mysql/data挂载到镜像中的/var/lib/mysql目录中
# 我们为什么知道要挂载到/var/lib/mysql中,请参照DockerHub的配置信息!!
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
# 默认构建当前路径下的user-service中的Dockerfile文件
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
7.2部署
进入Docker-Compose所在的目录,然后运行下面的命令:
docker-compose up -d
8.Docker镜像仓库
推送镜像到私有镜像服务必须先tag,以nginx为例,步骤如下:
① 重新tag本地镜像,名称前缀为私有仓库的地址:xxx.xxx.xxx.xxx:8080/
docker tag nginx:latest xxx.xxx.xxx.xxx:8080/nginx:1.0
② 推送镜像
docker push xxx.xxx.xxx.xxx:8080/nginx:1.0
③ 拉取镜像
docker pull xxx.xxx.xxx.xxx:8080/nginx:1.0