1、Docker简介
Docker如何解决不同系统环境的问题?
- 1、Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像,Docker应用运行在容器中,使用沙箱机制,相互隔离
- 2、Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
Docker与虚拟机差异
- docker是一个系统进程;虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
Docker架构
- 镜像(Image): Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像
- 容器(Container): 镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见
- Docker结构
- Docker是一个CS架构的程序,由两部分组成
- 服务端(server): Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client): 通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令
- Docker是一个CS架构的程序,由两部分组成
- DockerHub: DockerHub是一个Docker镜像的托管平台,这样的平台称为Docker Registry
2、Docker安装
- 1、如果已安装,可卸载
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、安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
- 3、更新本地镜像
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
- 4、安装docker
yum install -y docker-ce
# docker-ce为社区免费版本
- 5、启动docker
# 关闭防火墙
systemctl stop firewalld # 关闭
systemctl disable firewalld # 禁止开机启动防火墙
# 启动docker
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
- 6、检查docker安装是否成功
docker -v
- 7、配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://3cllwqwa.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 文档地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
3、Docker基本操作
- 镜像相关命令
- 镜像名称一般分两部分组成: [repository]:[tag]
- 在没有指定tag时,默认是latest,代表最新版本的镜像
- 镜像仓库地址: https://hub.docker.com/
3.1、镜像操作命令
docker build 构建镜像
docker push 推送镜像到服务
docker pull 从服务拉取镜像
docker pull mysql:5.7.25
docker images 查看镜像
docker rmi 删除镜像
docker rmi nginx:latest
docker save 保存镜像为压缩包
docker save -o nginx.tar nginx:latest
docker load 加载压缩包为镜像
docker load -i nginx.tar
3.2、容器操作命令
docker run 运行容器
docker run --name containerName -p 80:80 -d nginx
docker run 创建并运行一个容器
--name 容器名称,比如mn
-p 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d 后台运行容器
nginx 镜像名称
docker pause 容器暂停
docker unpause 容器恢复
docker stop 容器停止
docker start 容器启动
docker ps 查看所有运行的容器及状态
docker logs 查看容器运行日志
docker logs -f mysql
-f 持续查看日志
mysql 镜像名称
docker exec 进入容器执行命令
docker exec -it mn bash
docker exec: 进入容器内容
-it 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn 要进入的容器的名称
bash 进入容器后执行的命令,bash是linux终端交互命令
cd /user/share/nginx/html 进入nginx的html目录
修改呢index.html内容
sed -i 's#Welcome to nginx#传智教育欢迎您#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
docker rm 删除指定容器
3.3、数据卷
- 数据卷(volume): 是一个虚拟目录,指向宿主机文件系统中某个目录
- 作用: 将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
1、操作数据卷
docker volume [command]
- docker volume 数据卷操作,根据命令后跟随的command来确定下一步的操作
- command
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
2、挂载数据卷 - 创建容器并挂载数据卷到容器内的HTML目录
docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx
- docker run 创建并运行容器
- –name mn 给容器起名称叫mn
- -v html:/usr/share/nginx/html 把html数据卷挂载到容器内的/usr/share/nginx/html
- -p 80:80 把宿主机的80端口映射到容器内的80端口
- -d nginx 后台运行nginx镜像
3、进入html数据卷位置,修改html内容
docker volume inspect html
cd /var/lib/docker/volumes/html/_data
vi index.html
创建运行MySQL容器,将宿主机目录直接挂载到容器
mkdir /tmp/mysql/conf
mkdir /tmp/mysql/data
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
4、Dockerfile自定义镜像
4.1、镜像结构
- 镜像是分层结构,每一层称为一个Layer
- BaseImage层: 包含基本的系统函数库、环境变量、文件系统
- Entrypoint: 入口,是镜像中应用启动的命令
- 其他: 在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
4.2、Dockerfile
- Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像,每个指令都会形成一层Layer
4.3、构建一个项目
基于Ubuntu镜像构建新镜像
- 1、创建一个空文件夹docker-demo
- 2、拷贝docker-demo.jar到docker-demo目录下
- 3、拷贝jdk8.tar.gz到docker-demo目录下
- 4、在目录中创建Dockerfile文件
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
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
- 5、进入docker-demo目录
- 6、执行命令
docker build -t javaweb:1.0
- 7、运行
docker run --name docker-demo -p 8090:8090 -d javaweb:1.0
基于java:8-alpine镜像,构建新镜像
1、创建一个空文件夹docker-demo
2、拷贝docker-demo.jar到docker-demo目录下
3、在目录中创建Dockerfile文件
# 指定基础镜像
FROM java:8-alpine
# 拷贝java项目的包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
4、进入docker-demo目录
5、执行命令
docker build -t javaweb:1.0 .
6、运行
docker run --name docker-demo -p 8090:8090 -d javaweb:1.0
5、DockerCompose
- Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个一个创建和运行容器
- Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行
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: 123456
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
5.1、安装DockerCompose
1、下载
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、修改文件权限
chmod +x /usr/local/bin/docker-compose
3、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
6、部署微服务集群
- 1、修改cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名
- 2、使用maven打包工具,将项目每个微服务都打包成app.jar
- 3、将打包好的app.jar拷贝到cloud-demo每个对应的子目录中
- 4、将cloud-demo上传至虚拟机,利用docker-compose up -d来部署docker-compose logs
7、搭建私有Docker镜像仓库
7.1、简化版镜像仓库
- Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
7.2、图形化界面镜像仓库
- 使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
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
- 配置Docker信任地址
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
7.3、私有镜像仓库拉取和推送镜像
- 推送镜像到私有镜像服务必须先tag
1、重新tag本地镜像,名称前缀为私有仓库的地址: 192.168.21.100:8080/
docker tag nginx:latest 192.168.21.100:8080/nginx:1.0
2、推送镜像
docker push 192.168.21.100:8080/nginx:1.0
3、拉取镜像
docker pull 192.168.21.100:8080/nginx:1.0
8、docker镜像安装
8.1、Zookeeper的安装
1、拉取zk镜像
docker pull zookeeper:3.4.14
2、创建容器
docker create --name zk -p 2181:2181 zookeeper:3.4.14
3、启动容器
docker start zk
8.2、kafka的安装
1、下载镜像
docker pull wurstmeister/kafka:2.12-2.3.1
2、创建容器
docker run -d --name kafka \
--env KAFKA_ADVERTISED_HOST_NAME=192.168.200.130 \
--env KAFKA_ZOOKEEPER_CONNECT=192.168.200.130:2181 \
--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.200.130:9092 \
--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
--env KAFKA_HEAP_OPTS="-Xmx256M -Xms256M" \
--net=host wurstmeister/kafka:2.12-2.3.1
注意:
Kafka对于zookeeper是强依赖,保存kafka相关的节点数据,所以安装kafka之前必须先安装zookeeper
8.3、搭建Redis集群
1、拉取镜像
docker pull redis:5.0.2
# 开启组件集群
# 创建容器
docker create --name redis-node01 -v /data/redis-data/node01:/data -p 6379:6379 redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-01.conf
docker create --name redis-node02 -v /data/redis-data/node02:/data -p 6380:6379 redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-02.conf
docker create --name redis-node03 -v /data/redis-data/node03:/data -p 6381:6379 redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-03.conf
# 启动容器
docker start redis-node01 redis-node02 redis-node03
# 进入redis-node01进行操作
docker exec -it redis-node01 /bin/bash
# 组建集群
redis-cli --cluster creare 172.17.0.1:6379 172.17.0.1:6380 172.17.0.1:6381 --cluster-replicas 0
# 查看容器的ip地址
docker inspect redis-node01 -> 172.17.0.4
# 使用host网络搭建集群
# 创建集群
docker create --name redis-node01 --net host -v /data/redis-data/node01:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-01.conf --port 6379
docker create --name redis-node02 --net host -v /data/redis-data/node02:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-02.conf --port 6380
docker create --name redis-node03 --net host -v /data/redis-data/node03:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-03.conf --port 6381
# 启动容器
docker start redis-node01 redis-node02 redis-node03
#进入redis-node01容器进行操作
docker exec -it redis-node01 /bin.bash
# 192.168.21.100是主机的ip地址
redis-cli --cluster create 192.168.21.100:6379 192.168.21.100:6380 192.168.21.100:6381 --cluster-replicas 0
# 测试redis
[root@localhost ~]# docker exec -it redis-node01 /bin/bash
root@localhost:/data# redis-cli -c
127.0.0.1:6379> set abc 123
192.168.21.100:6380> get abc
8.4、MongoDB安装
1、拉取镜像
docker pull mongo
2、创建容器
docker create --name mongodb -p 27017:27017 -v /data/mongodb:/data/db mongo
3、启动容器
docker start mongodb
4、进入容器
docker exec -it mongodb /bin/bash
5、使用mongodb客户端进行操作
root@27fe09c11bca:/# mongo
6、查询所有的数据库
> show dbs
8.5、nacos安装
1、 镜像拉取
docker pull nacos/nacos-server:1.2.0
2、 创建容器
docker run --env MODE=standalone --name nacos --restart=always -d -p 8848:8848 nacos/nacos-server:1.2.0
- MODE=standalone 单机版
- --restart=always 开机启动
- -p 8848:8848 映射端口
- -d 创建一个守护式容器在后台运行
3、访问地址
http://1.92.168.200.130:8848/nacos
8.6、redis安装
1、拉取镜像
docker pull redis
2、创建容器
docker run -d --name redis --restart=always -p 6379:6379 redis --requirepass "leadnews"
- --requirepass "leadnews" 设置密码,密码为leadnews
8.7、ElasticSearch安装
1、拉取镜像
docker pull elasticsearch:7.4.0
2、创建容器
docker run
-id \
--name elasticsearch \
-d \
--restart=always \
-p 9200:9200 \
-p 9300:9300 \
-v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-e "discovery.type=single-node" \
elasticsearch:7.4.0
3、配置中文分词器 ik
注:因为在创建elasticsearch容器的时候,映射了目录,所以可以在宿主机上进行配置ik中文分词器;在选择ik分词器的时候,需要与elasticsearch的版本好对应上
#切换目录
cd /usr/share/elasticsearch/plugins
#新建目录
mkdir analysis-ik
cd analysis-ik
#root根目录中拷贝文件
mv elasticsearch-analysis-ik-7.4.0.zip /usr/share/elasticsearch/plugins/analysis-ik
#解压文件
cd /usr/share/elasticsearch/plugins/analysis-ik
unzip elasticsearch-analysis-ik-7.4.0.zip