Docker容器
初始Docker
项目部署的问题:大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
Docker如何解决依赖的兼容性问题?
镜像与容器
DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
Docker架构
Docker是一个CS架构的程序,由两部分组成:
安装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
安装yum工具
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:
yum install -y docker-ce
启动docker(先关闭防火墙)
systemctl start docker
配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hwaf3xix.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker的基本操作
docker build #构建镜像
docker push #推送镜像到服务
docker images#查看镜像
docker rmi #删除镜像
docker pull #从服务拉取镜像
docker save #保存镜像为一个压缩包
docker load #加载压缩包为镜像
docker run #容器创建和运行
docker exec #进入容器执行命令
docker logs #查看容器运行日志
docker ps #查看所有运行的容器及状态
docker pause #暂停容器
docker unpause #取消暂停
docker start #运行容器
docker stop #停止容器
案例创建运行一个Nginx容器
1.去docker hub查看nginx的容器运行命令
docker run --name containerName -p 80:80 -d nginx
#docker run :创建并运行一个容器
#--name:给容器起一个名字,比如叫做mn
#-p: 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
案例进入Nginx容器,修改HTML文件内容,添加“HelloWorld你好世界”
1.进入创建的nginx容器
docker exec -it nginxTest bash
#docker exec:进入容器内部,执行一个命令
#-it:给当前进入的容器创建一个标准输入,输出终端,允许我们与容器交互
#nginxTest:要进入的容器的名称
#bash:进入容器执行的命令,bash是一个linux终端交互命令
2.在官网可以知道nginx容器静态资源目录在
/usr/share/nginx/html #在进入容器里面的目录路径
3.修改静态文件
sed -i 's#Welcome to nginx#HelloWorld你好世界#g' index.html
sed -i 's###g' index.html
数据卷(容器数据管理):作用 将容器与数据分离
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
数据卷操作的基本语法如下:
docker volume[command]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
create #创建一个volume
inspect #显示一个或多个volume的信息
ls #列出所有的volume
prune #删除未使用的volume
rm #删除一个或多个指定的volume
案例:创建一个数据卷,并查看数据卷在宿主机的目录位置
创建数据卷
docker volume create html #创建一个名为html的数据卷
查看所有数据
docker volume ls #查看所有的数据卷
查看数据卷详细信息卷
docker volume inspect html
删除未使用卷
docker volume prune
挂载数据卷
在创建容器时,可以通过 -v参数来挂载一个数据卷到某个容器目录
docker run -name mn -v html:/root/html -p 8080:80 -d nginx
#创建一个名为 mn的容器
#-v 把html数据卷挂载到容器内的/root/html 这个目录中
#-p 端口映射
创建一个nginx容器,修改容器内的html目录内的index.html内容
需求说明:进入nginx容器内部,已经知道nginx的html目录所在位置(/usr/share/nginx/html,需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。)
创建容器并挂载数据卷到容器内的HTML目录
docker run --name nginxTest2 -v html:/usr/share/nginx/html -p 6767:81 -d nginx
进入html数据卷所在位置,并修改HTML容器
cd /var/lib/docker/volumes/html/_data
创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
docker run
--name mysql5.4.7
-e MYSQL_ROOT_PASSWORD=redhat
-p 3309:3306
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.conf #mysql配置文件挂载
-v /tmp/mysql/data:/var/lib/mysql/ #mysql数据卷挂载
-d mysql:5.7.41
Dockerfile自定义镜像
镜像结构:镜像是分层结构,每一层称为一个Layer
什么是Dockerfile:Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
官方文档:https://docs.docker.com/engine/reference/builder/
案例基于镜像构建一个新镜像,运行一个Java项目
新建一个空文件夹docker-demo
随便准备一个简单boot项目.jar文件到docker-demo这个目录
并将jdk8.tar.gz文件弄到docker-demo这个目录
将Dockerfile放到docker-demo这个目录
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./Love-0.0.1-SNAPSHOT.jar /tmp/love.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_201 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口:docker-demo.jar打包时暴露的是1314端口
EXPOSE 1314
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/love.jar
进入docker-demo
运行命令进行镜像构建
docker build -f /root/docker-demo/Doerfile . -t javalove:1.0 #不同版本docker执行的命令不同
运行容器
docker run --name love -p 1314:1314 -d javalove:1.0
基于java:8-alpine镜像构建镜像
# 指定基础镜像
FROM java:8-apline
# 暴露端口:docker-demo.jar打包时暴露的是1314端口
EXPOSE 1314
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/love.jar
Docker-Compose
初始DockerCompose:可以基于Compose帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
version: '3.8'
services:
mysql:
# 镜像名
image: mysql:5.7.25
# 容器名(以后的控制都通过这个)
container_name: mysql
# 重启策略
restart: always
environment:
# 时区上海
TZ: Asia/Shanghai
# root 密码
MYSQL_ROOT_PASSWORD: root
# 初始化数据库(后续的初始化sql会在这个库执行)
MYSQL_DATABASE: nacos_config
# 初始化用户(不能是root 会报错, 后续需要给新用户赋予权限)
MYSQL_USER: redhat
# 用户密码
MYSQL_PASSWORD: redhat
# 映射端口
ports:
- 3306:3306
volumes:
# 数据挂载
#- /root/mysql/data/:/var/lib/mysql/
# 配置挂载
#- /root/mysql/conf/:/etc/mysql/conf.d/
# 初始化目录挂载,注意此处我只跑了这个挂载,只是为了说明其他配置不应该数据初始化
- /root/mysql/init/:/docker-entrypoint-initdb.d/
web:
build:
ports:
-8090:8090
安装DockerCompose
下载与安装
# 安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compos
修改文件权限
chmod +x /usr/local/bin/docker-compose
Base自动补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果这里出现错误,需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
部署微服务集群
案例:将之前cloud-demo利用DockerCompose集群部署
docker-compose.yml
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- "./mysql/data:/var/lib/mysql"
- "./mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
Dockerfile:
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
进入could-demo目录进行构建
docker-compose up -d
Docker镜像仓库:镜像仓库( Docker Registry )有公共的和私有的两种形式
配置Docker信任地址
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
简化版镜像仓库
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
带有图形化界面版本docker-compose.yaml 文件 docker-compose up -d 执行
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