一,安装docker
1,配置网络相关
#关闭防火墙,并取消开机启动
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux
vim /etc/selinux/config
改为disabled
#永久关闭swap
vim /etc/fstab
注释掉/dev/mapper/centos-swap swap swap defaults 0 0 或者下面这句话
UUID=069da836-7aaf-41f5-b2d1-dbb72e8eecf1 swap swap defaults 0 0
2,配置yum源
(1)设置aliyun yum源
#移动原本源
mv /etc/yum.repos.d/* /opt
#通过curl下载aliyun 源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
常见问题以及解决方案:
源拉取失败:可能是自己的ip地址被ban,可以通过更改网络环境修复。
可能是aliyun更改了源地址,前往aliyun更改地址即可。
上述方法都不行可以尝试更换其他源。
(2)开启流量转发(选做)
vim /etc/sysctl.d/docker.conf
net.ipv4.ip_forward=1
(3)下载,安装docker
yum clean all
yum install docker -y
ps:我选择装的是默认版的docker,如需指定ce或者ee版请在docker后加-ce或-ee
(4)配置加速器
自己注册aliyun账号,获取加速器代码,博主这里是8xpk5wnt
vi /etc/docker/daemon.json
{
"registry-mirrors" : ["https://#你的代码#.mirror.aliyuncs.com"]
}
(5)启动docker 并查看版本
#重启虚拟机
reboot
#启动docker:重载daemon,设置开机自启
systemctl enable docker
systemctl daemon-reload
systemctl restart docker
docker --version
二,docker相关命令
1,镜像相关命令
查看镜像
docker images
# 查看所用镜像的id
docker images –q
docker search 镜像名称
#查找nginx镜像
docker search nginx
docker pull 镜像名称
#下载最新版本redis
docker pull redis
#下载5.0版本redis
docker pull redis:5.0
ps:一般不指定端口号的情况下则是最新的版本lastest
docker rmi 镜像id # 删除指定本地镜像
docker rmi -f 镜像id # 强制删除指定本地镜像
docker images -q # 查看所有的镜像列表
docker rmi `docker images -q` # 删除所有本地镜像
2,容器相关命令
查看容器
docker ps # 查看正在运行的容器
docker ps –a # 查看所有容器
docker run 参数
相关参数:
#创建交互式容器
docker run -it --name=mhy centos:7 /bin/bash
#创建守护式容器
docker run -id --name=mhy2 centos:7
ps:交互式容器,exit后容器自动关闭,守护式容器会在后台执行
进入容器
docker exec -it mhy /bin/bash #进入容器
docker stop 容器名称
删除容器
docker rm 容器名称
docker rm -f 容器名称 # 强制删除容器
查看容器信息
docker inspect 容器名称
退出容器
exit
3,卸载docker
-- 查看yum安装的docker文件包
yum list installed |grep docker
-- 查看docker相关的rpm源文件
rpm -qa |grep docker
-- 删除相关服务
yum -y remove docker相关
三,简单部署项目
1,部署mysql数据库(redis同理,更换相关包名即可)
拉取mysql5.7镜像
docker pull mysql:5.7
docker run -d --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=mhy mysql:5.7
-- 想存入中文还不想要乱码就按照以下内容创建容器
docker run -d --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e
MYSQL_DATABASE=mhy mysql:5.7 --character-set-server=utf8mb4 --collationserver=utf8mb4_unicode_ci
相关参数:
docker pull tomcat
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat2 -p 8082:8080 -v $PWD:/usr/local/tomcat/webapps tomcat
ps:上面ROOT文件夹对应容器中/usr/local/tomcat/webapps下面的ROOT文件夹
在里面放入test.html
echo "hello Docker" > test.html
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
案例:
docker run -id --name=c_tomcat2 \
-p 8082:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
这里就是将当前目录作为宿主机目录,后面为容器内tomcat目录,$PWD表示当前目录
ps:
1. 容器目录必须是绝对路径
2. 如果目录不存在,会自动创建
# 在/root目录下创建mysql目录用于存储mysql数据信息
# 每行指令后面"\"表示换行
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
docker stop mysql2
看到宿主机目录还在
docker run -id \
-p 3007:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
可以看到容器挂载在不同的两个数据卷上
(3)两个容器挂载同一个数据卷
# 第一个容器
docker run -id \
-p 33306:3306 \
--name=mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
# 第二个容器
docker run -id \
-p 33307:3306 \ # 此处端口号发生变化
--name=mysql2 \ # 此处名称发生变化
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
进入容器可以看到更改其中一个容器,另一个容器和宿主机都会变动
(4)配置使用数据卷容器
1,创建一个数据卷容器
docker run –it --name=c3 –v $PWD:/volume centos:7 /bin/bash
2,创建两个容器使用--volumes-from 参数 设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
效果:
docker exec -it c3 /bin/bash
cd /volume/
mkdir aa
exit
docker exec -it c2 /bin/bash
cd /volume/
ls
exit
docker exec -it c1 /bin/bash
cd /volume/
ls
exit
5,容器转镜像
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load –i 压缩文件名称
案例:将一个tomcat容器转为镜像
# 创建tomcat容器
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
# 进入tomcat容器
docker exec -it c_tomcat /bin/bash
#在/root下创建a.txt b.txt 在webapps下面创建一个文件夹/test
cd ~
touch a.txt b.txt
#容器转镜像
docker commit 容器ID sj_tomcat:1.0
#压缩镜像
docker save -o sj_tomcat.tar sj_tomcat:1.0
#删除原来镜像
docker rmi sj_tomcat:1.0
#从压缩文件加载镜像
docker load -i sj_tomcat.tar
#创建容器
docker run -it --name=new_tomcat sj_tomcat:1.0 /bin/bash
#进入容器查看内容
docker exec -it new_tomcat /bin/bash
#可以看到a.txt b.txt存在,而webapps/test不存在
重点:容器转镜像不能转数据卷文件
四,dockerfile
概念:
FROM:这是所有Dockerfile的起始关键字,用于指定构建目标镜像的基础镜像。该关键字决定了后续指令运行的环境。
MAINTAINER:用于指定制作这个 Dockerfile 的作者信息,该指令已被标记为弃用,新的 LABEL 指令被推荐用来替代它,用于添加元数据到镜像中。
RUN:用于在镜像构建过程中执行特定命令,它可以安装软件包、删除文件等。通过此关键字,可以一步步修改基础镜像,使其满足使用需求。
COPY和ADD:这两个关键字用于将文件或目录从宿主机复制到镜像中。COPY适用于本地文件系统路径,而ADD除了具备COPY的功能外,还可以解压缩压缩文件和处理远程URL。
CMD和ENTRYPOINT:CMD指定容器启动时要运行的命令,但不适宜处理牙嵌套命令。ENTRYPOINT设置容器启动时执行的命令并允许牙嵌套命令,即它指定的命令会作为容器的主进程。
ENV:设置容器内部环境变量的关键字,这些变量可在运行时传递给应用程序,或者在Dockerfile其他指令中使用。
EXPOSE:声明容器将要监听的端口,但这不会自动将端口发布到宿主机。发布操作需在运行容器时通过参数实现。
VOLUME:用于创建可以被一个或多个容器使用的数据卷,通常用于持久化数据和共享配置。
WORKDIR:设置Dockerfile后续指令的工作目录路径,此目录下的命令(如RUN、CMD)都会在此目录下执行。
USER:切换运行用户,适用于需要特定用户权限运行的应用。
HEALTHCHECK:用于定义容器健康检查的命令,帮助监控系统中容器的状态。
SHELL:在RUN、CMD、ENTRYPOINT之前设置一个默认的shell类型以便执行后续命令。
LABEL:该关键字用于定义镜像的标签,使得用户能够以键值对的形式为镜像添加元数据。例如 LABEL version="1.0" description="This is a custom image for my application" author="YourName"。
ARG:在 Dockerfile 中定义构建参数,允许在构建时传递变量。比如 ARG VERSION,在构建时可以通过 docker build --build-arg=VERSION=1.2 . 来指定版本号。
ONBUILD:当这个镜像用作其他 Dockerfile 的基础镜像时,ONBUILD 指令会在那个 Dockerfile 执行 FROM 指令后立即执行指定的命令。这允许创建触发器,用以自动执行某些操作。
STOPSIGNAL:设置发送给容器以退出的系统调用信号,这可以用于关闭容器中的进程。
------------------------------------------------------------------------------------------------------------------
案例:以centos7为基础创建一个镜像,可以使用vim编辑器,默认工作目录为/root
FROM centos:7
MAINTAINER Mei
RUN yum install -y vim
WORKDIR /root
CMD /bin/bash
使用docker build命令创建
docker build -f ./dockerfile -t yuanshen .
语法格式:docker build -f dockerfile文件的绝对路径 -t 自定义名称 .
ps:有时容器内安装软件时会遇到yum源无法使用的问题,需要手动配置源
RUN mv /etc/yum.repos.d/* /opt && \
curl -o /etc/yum.repos.d/centos.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo && \
yum install vim -y
把这个替换到原本的yum语句上
五,docker的服务编排
概念:Docker Compose是一个编排多容器分布式部署的工具,提供命令集中管理容器化应用的完整开发周期,包括服务构建,启动和停止
1,安装docker-compose
将编译好的包下载下来
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname - m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -version
2,编排nginx+springboot
创建测试文件夹test并进入
mkdir ~/docker-compose
cd ~/docker-compose
编写docker-compose.yml文件
vim docker-compose
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
重点:严格注意缩进格式!!!
mkdir -p ./nginx/conf.d # 跟上面docker-compose.yml中vloumes对应即可
vim ./nginx/conf.d/app.conf
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080/;
}
}
docker-compose up -d # -d表示使用守护模式启动
docker-compose down # 停止容器