一.介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
镜像(Image)、容器(Container)与仓库(Repository),这三个是Docker中最基本也是最核心的概念,对这三个概念的掌握与理解,是学习Docker的关键。
Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件,另外还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
我的Linux:CentOS-7-x86_64-DVD-1810.iso
二.安装
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.首先需要大家虚拟机联网,安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
3.设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/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缓存
yum makecache fast
4.安装docker
yum install -y docker-ce
5.启动docker前,一定要关闭防火墙后
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
6.启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
7.查看docker版本
docker -v
镜像操作
命令 | 说明 |
docker images | 列出本地images |
docker images --no-trunc | 显示镜像完整信息 |
docker search mysql | 搜索仓库MySQL镜像 |
docker pull redis | 下载Redis官方最新镜像 ,相当于:docker pull redis:latest |
docker pull bitnami/redis | 下载私人仓库镜像 |
docker rmi redis(ID) | 单个镜像删除,相当于:docker rmi redis:latest |
docker rmi -f $(docker images -q) | 删除本地全部镜像 |
三.安装镜像
一.nginx为例
访问dockerhub官网https://hub.docker.com搜索nginx
1.拉取自己需要的镜像,通过命令:
docker pull nginx
2 . 查看拉取到的镜像docker images
docker images
3.导出镜像到磁盘
docker save -o nginx.tar nginx:latest
4.先删除本地的nginx镜像
docker rmi nginx:latest
5.加载本地文件:
docker load -i nginx.tar
二.安装mysql镜像
1.查找MySQL镜像:
docker search mysql
2.拉取MySQL5.7版本镜像
docker pull mysql:5.7
3.先查看端口
netstat -anp |grep 3306
如果被占用,关闭3306端口
#1.杀死进程
kill -9 PID
#2.关闭端口
sendmail stop mysqld
#3.停止mysqld服务
service mysqld stop
4.运行mysql容器
docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/conf/my.cnf:/etc/my.cnf -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
命令 | 说明 |
run | run 是创建并运行一个容器 |
-d | 表示后台运行 |
-p | 表示容器内部端口和服务器端口映射关联 |
–privileged=true | 设值MySQL 的root用户权限, 否则外部不能使用root用户登陆 |
-v /docker/mysql/conf/my.cnf:/etc/my.cnf | 将服务器中的my.cnf配置映射到docker中的/docker/mysql/conf/my.cnf配置 |
-v /docker/mysql/data:/var/lib/mysql | 同上,映射数据库的数据目录, 避免以后docker删除重新运行MySQL容器时数据丢失 |
-e MYSQL_ROOT_PASSWORD=123456 | 设置MySQL数据库root用户的密码 |
–name mysql | 设值容器名称为mysql |
mysql:5.7 | 表示从docker镜像mysql:5.7中启动一个容器 |
–character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci | 设值数据库默认编码 |
4.新建MySQL用户,先进入容器
docker exec -it mysql bash
5.执行MySQL命令, 输入root密码, 连接MySQL
mysql -uroot -p
6.输入密码后, 创建新用户 (用户名: zhangsan, 密码: zs123)
GRANT ALL PRIVILEGES ON *.* TO 'zhangsan'@'%' IDENTIFIED BY 'zs123' WITH GRANT OPTION;
容器命令
命令 | 说明 |
docker search mysql | 查询需要的容器名称 |
docker ps | 查看运行的docker容器 |
docker ps -a | 查看所有的docker容器 |
docker logs -f name/ID | 查看docker容器日志 |
docker start name/ID | 启动docker容器 |
docker stop name/ID | 停止当前运行的docker容器 |
docker stop $(docker ps -aq) | 停止所有运行的docker容器 |
docker restart name/ID | 重启docker容器 |
docker restart $(docker ps -a -q) | 重启所有容器 |
docker rm name/ID | 删除docker容器 |
docker rm $(docker ps -aq) | 删除所有docker容器 |
docker exec -it name/ID bash | 进入容器 |
exit | 退出docker容器 |
docker run --name containerName -p 80:80 -d nginx | 创建并运行nginx容器 |
启动所有容器
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
再举例创建并运行redis:
docker run
-d \
--name=redis \
--restart=always \
--privileged=true \
-p 6379:6379 \
-v /usr/local/docker/redis/conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis/data:/data \
redis:5.0.2 --requirepass "123456"
命令 | 说明 |
run | run 是创建并运行一个容器 |
-d | 表示后台运行 |
–name redis | 设值容器名称为redis |
–restart=always | 自动启动容器 |
–privileged=true | 使用该参数,container内的root拥有真正的root权限,外部的一个普通用户权限 |
-p 6379:6379 | 将主机的6379端口映射到容器的6379端口 |
-v /usr/local/docker/redis/conf:/etc/redis/redis.conf | 配置文件映射,容器启动成功可以通过更改宿主机的配置文件来达到更改容器实际配置文件的目的 |
-v /usr/local/docker/redis/data:/data | /usr/local/my-redis/data是宿主机中持久化文件的位置,/data是容器中持久化文件的位置 |
进入容器后运行客户端redis-cli
其他参数 | 说明 |
-itd | -i: 交互式操作,-t: 终端 ,-d:后台运行 |
四.数据卷
一.介绍
修改nginx的html页面时,需要进入nginx内部。并且因为没有编辑器,修改文件也很麻烦。
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。
这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了
二.创建数据卷
① 创建数据卷
docker volume create html
② 查看所有数据
docker volume ls
③ 查看数据卷详细信息卷
docker volume inspect html
三.挂载数据卷
1.创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录
docker run --name containerName -v html:/usr/share/nginx/html -p 80:80 -d nginx
- 进入html数据卷所在位置,并修改HTML内容
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data:
# 修改文件
vi index.html
命令 | 说明 |
docker volume create | 创建数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume inspect | 查看数据卷详细信息,包括关联的宿主机目录位置 |
docker volume rm | 删除指定数据卷 |
docker volume prune | 删除所有未使用的数据卷 |
五.自定义镜像
一.介绍
镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。自定义镜像,其实就是实现上述打包的过程。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。
指令 | 说明 | 实例 |
FROM | 指定基础镜像 | FROM |
ENV | 设置环境变量 | ENV key value |
COPY | 拷贝本地镜像到指定目录 | COPY ./mysql-5.7.rpm/tmp |
RUN | 执行Linux的shell命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,运行是调用 | ENTRYPOINT java -jar xx.jar |
二.实例,基于Ubuntu构建Java项目
1.在/tmp/下新建一个docker-demo目录
mkdir -p /tmp/docker-demo
2.将需要的文件拷贝到目录
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=PATH:$JAVA_HOME/bin
暴露端口
EXPOSE 8090
入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
3.进入docker-demo目录下创建镜像,注意最后的空格加点,代表Dockerfile所在目录。
docker build -t javaweb:1.0 .
4.最后创建并运行容器,访问192.168.***.***:8090/hello/count
docker run --name web -p 8090:8090 -d javaweb:1.0
六.安装DockerCompose
一.介绍:
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!通过指令定义集群中的每个容器如何运行。
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
web:
build: .
ports:
- "8090:8090"
上面的Compose文件就描述一个项目,其中包含两个容器:
- mysql:一个基于
mysql:5.7.25
镜像构建的容器,并且挂载了两个目录 - web:一个基于
docker build
临时构建的镜像容器,映射端口时8090
二.安装DockerCompose
1.修改文件权限,不然无法下载
# 修改权限
chmod +x /usr/local/bin/docker-compose
2.下载
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /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.168.131 raw.githubusercontent.com" >> /etc/hosts
七.DockerCompose部署微服务
1.将所需微服务打成jar包
每个微服务pom修改,后打成app.jar
<build>
<!-- 服务打包的最终名称 -->
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.编辑一个cloud-demo包,放入tmp目录
gateway内容
根据Dockerfile文件可知,这是基于8-alpine自定义的镜像
其他user、order-service都是一样mysql目录内容
hmy.cnf是mysql配置
这些是数据库
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: 123
volumes:
- “PWD/mysql/conf:/etc/mysql/conf.d/”
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- “10010:10010”
3.最后在/tmp目录下运行
docker-compose up -d
注意:由于有些服务需要先运行,而docker-compose运行的项目微服务是一起运行的。所有需要重新让部分先运行。
docker-compose restart 微服务名称
4.下面是我的老师给我的某些容器开机自启脚本
version: "3.5"
services:
redis:
image: redis:5.0.2
container_name: redis
ports:
- 6379:6379
volumes:
- /data/redis:/data
restart: always
networks:
itcast:
aliases:
- redis
mongo:
image: mongo:4.4
container_name: mongo
ports:
- 27017:27017
volumes:
- /data/mongodb/db:/data/db
- /data/mongodb/tanhua:/data/tanhua
environment:
- MONGODB_USER=root
- MONGODB_PASS=root
- MONGODB_DATABASE=testdb
restart: always
networks:
itcast:
aliases:
- mongo
nacos:
image: nacos/nacos-server
container_name: nacos
volumes:
- /data/nacos/logs:/home/nacos/logs
ports:
- 8848:8848
environment:
- MODE=standalone
restart: always
networks:
itcast:
aliases:
- nacos
yapi:
image: mrjin/yapi:latest
container_name: yapi
environment:
- VERSION=1.5.6
- LOG_PATH=/tmp/yapi.log
- HOME=/home
- PORT=3000
- ADMIN_EMAIL=tanhua@itcast.cn
- DB_SERVER=mongo
- DB_NAME=yapi
- DB_PORT=27017
restart: always
ports:
- 3000:3000
volumes:
- /data/yapi/log/:/home/vendors/log
depends_on:
- mongo
entrypoint: "bash /wait-for-it.sh mongo:27017 -- entrypoint.sh"
networks:
itcast:
aliases:
- yapi
networks:
itcast:
name: itcast
driver: bridge
compose命令
命令 | 说明 |
docker-compose up -d | 在后台所有启动服务 |
docker-compose stop | 停止正在运行的容器 |
docker-compose logs | 打印日志 |
docker-compose pull | 拉取服务依赖的镜像 |
docker-compose rm -f | 强制直接删除,包括非停止状态的容器 |
docker-compose restart | 重启项目中的服务 |
八.搭建镜像仓库
一.私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["192.168.本机ip.32:8080"]
#最终
vi /etc/docker/daemon.json{
“registry-mirrors”: [
“https://tnxkcso1.mirror.aliyuncs.com”
],
“insecure-registries”:[“192.168.本机ip.32:8080”]
}
重加载
systemctl daemon-reload
重启docker
systemctl restart docker
二.使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
1.创建一个目录
mkdir -p /tmp/register-ui
2.创建一个docker-compose.yml文件
#进入/tmp/register-ui目录
cd /tmp/register-ui
#创建docker-compose.yml文件
touch docker-compose.yml
2.打开touch docker-compose.yml文件加入下面配置
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=Mine仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
3.进入docker-compose.yml目录,启动仓库
docker-compose up -d
4.查看日志
docker-compose logs -f
三.推送、拉取镜像
① 重新tag本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
② 推送镜像
docker push 192.168.150.101:8080/nginx:1.0
③ 拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0
访问仓库:192.168.本机ip.32:8080/