1、docker
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
2、初识docker
开发环境 -> 测试环境 -> 生产环境
3、安装docker
# 1、切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
# 3、安装特定版本的docker-ce
# 必须指定 --setopt=obsoletes=0,否则yum会自动安装更高版本。
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4、添加一个配置文件
# Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用sysetemd来代替cgroupfs
mkdir /etc/docker
cd /etc/docker
touch daemon.json
通过vi编辑器输入一下内容
{
"registry-mirrors":["https://nh2pqkbt.mirror.aliyuncs.com"],
"insecure-registries":["192.168.31.101:5000"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
#5、启动docker
systemctl enable docker
systemctl restart docker
# 6、查看docker版本,验证是否安装成功
docker -v
4、docker架构
镜像(Image)
容器(Container)
仓库(Repository)
5、配置docker镜像加速器(安装时已配置无需做)
设置docker国内镜像源【国内镜像源大全】_docker镜像网站-CSDN博客
1、创建文件:touch /etc/docker/daemon.json
2、然后vi编辑器输入以下内容
{
"registry-mirrors": ["https://nh2pqkbt.mirror.aliyuncs.com"]
}
上述内容如果拷贝的网页上的,注意删除下看不见的空格,否则很容易因为看不见的字符导致json格式解析失败,进而导致docker启动失败,最好是拷贝到一个纯文本文件中(不带格式),调整以下再拷贝。如果实在不行就手动输入,切注意使用英文输入法。
3、重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
6、docker命令——服务相关命令
启动:systemctl start docker
状态:systemctl status docker
停止: sysetmctl stop docker
重启:sysetmctl restart docker
开机自启动: systemctl enable docker
7、docker命令——镜像相关命令
查看:docker images
搜索:docker seearch redis(搜索“redis”)
拉取:docker pull redis (默认latest版本)
拉取:docker pull redis:5.0(下载5.0版本,镜像有哪些版本需要去hub上自己去查)
删除:docker rmi imgae_id (image输入具体的镜像id)
删除: docker rmi name:tag (由于相同name可能有不同的tag,所以需要name+tag)
全部删除: docker rmi `docker images -q` (docker images -q查看所有镜像的id)
8、docker命令——容器相关命令1
创建容器:docker run -it --name=c1 centos:7 /bin/bash (-i 保持运行,-t分配终端 ,--name起名字, /bin/bash 进入容器的初始化指令) ※交互式容器
创建容器:docker run -id --name=c1 centos:7 (-i 保持运行,-d后台运行,退出容器容器不关闭 ,--name起名字) ※守护式容器
exit 退出容器,回到宿主机
查看容器;:docker ps (正在运行的)
查看容器:docker ps -a (所有容器)
进入容器:docker exec -it C2 bin/bash
补充:docker run -e TZ=Asia/Shanghai --name your_container_name -d your_image
-e指定时区
9、docker命令——容器相关命令2
停止容器:docker stop 容器ID/容器名称
启动容器:docker start 容器ID/容器名称
删除容器:docker rm 容器ID/容器名称
删除所有:docker rm `docker ps -aq` (运行状态的无法删除)
查看容器信息: docker inspect 容器ID/容器名称
10、docker 容器数据卷——数据卷概念以及作用
11、docker 容器数据卷——配置数据卷(持久化)
docker run -id --name=c1 -v /root/data:/root/data_container centos:7
touch a.txt 创建一个文件,exit到宿主机,然后cd 到 /root/data 下查看文件。删除c1后,宿主机的data目录依然存在。
-v参数可以设置多个,实现一个容器挂载多个目录。
12、docker 容器数据卷——配置数据卷2(容器间通信)
多个容器挂载同一个目录,操作步骤同上。效果如如图。
13、docker 容器数据卷——数据卷容器
1、创建启动c3数据卷容器,使用-v参数设置数据卷
docker run -id --name=c3 -v /volume centos:7
2、创建启动 c1 c2 容器,使用 --volumes-from 参数设置容器卷
docker run -id --name=c1 --volumes-from c3 centos:7
docker run -id --name=c2 --volumes-from c3 centos:7
3、通过touch 文件查看各个容器的volume目录的文件同步情况。
只是一种简便的配置的方式,即使c3不在运行状态,c1 c2运行不受影响。可以通过docker inspect命令查看这几个容器,他们的Mounts节点信息是一样的。
14、docker应用部署——部署mysql
1、搜索mysql镜像
docker search mysql
2、拉取mysql镜像
docker pull mysq 5.6
3、创建容器,设置端口映射、目录映射。
# 在root目录下创建mysql目录,用于存储mysql信息
mkdir ~/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/logs:/logs \
-v /root/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
遗留:对于诸多的中间件,如果需要在docker里部署,第一手的资料是从docker的相关资料文档上去找,还是去该中间件的官方文档去找。
15、docker应用部署——部署tomcat
1、搜索tomcat镜像
docker search tomcat
2、拉取tomcat镜像
docker pull tomcat
3、创建容器、设置端口映射、目录映射
mkdir /root/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v /root/tomcat/:/usr/local/tomcat/webapps \
tomcat
4、验证
cd /root/tomcat
mkdir test
cd test
touch index.html
最后随便在index.html里写点html代码,然后再浏览器里访问 http://宿主机IP:8080/test/index.html
16、docker应用部署——部署nginx
1、搜索nginx镜像
docker search nginx
2、拉取nginx镜像
docker pull nginx
3、准备工作
mkdir /root/nginx
cd /root/nginx
mkdir conf
cd conf
vim nginx.conf (内容直接用nginx安装包里的nginx.conf文件,因为这个文件是nginx的核心配置文件,是需要根据业务调整的,因此需要通过挂载的方式保存在宿主机上)
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
4、创建容器、设置端口映射、目录映射
docker run -id --name=c_nginx \
-p 80:80 \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/nginx/logs/:/var/log/nginx \
-v /root/nginx/html:/etc/nginx/html \
nginx
注意:不同版本的nginx,目录结构有可能有所不同。
17、docker应用部署——部署redis
1、搜索redis镜像
docker search redis
2、拉取redis镜像
docker pull redis:5.0
3、创建容器、设置端口映射
docker run -id \
-p 6379:6379 \
--name c_redis \
-v /root/redis/redis.conf:/etc/redis/redis.conf \
-v /root/redis/data:/data \
redis:5.0
遗留:redis的配置文件,持久化等。
4、使用外部机器链接redis,或者其他UI客户端
./redis-cli.exe -h 192.168.31.101 -p 6379
18、dockerfile——镜像原理
Linux文件系统:
分层的文件系统:
19、dockerfile——容器转为镜像
目录挂载的内容不会打到新的镜像里,因为他们实际存在在宿主机的目录里。
20、dockerfile——dockerfile概述以及关键字
常见命令:
21、dockerfile——案例——部署springboot项目
dockerfile文件示例:
FROM java:8
MAINTAINER zhaojufei
ADD web-openapi-1.0.0.jar app.jar
CMD java -jar app.jar
构建镜像命令:docker build -f ./springboot_dockerfile -t app .
需要把jar包ftp到linux某个目录,并且dockerfile和jar在同一个目录下,方便ADD。
22、dockerfile——案例——自定义centos
23、docker compose——概述
24、docker compose——安装使用
安装docker compose
# compose目前已经完全支持Linux、Mac Os和Windows,在我们安装Compose之前,需要先安装docker。下面我们以编译好的二进制包方式安装在Linux系统中。
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
卸载docker-compose
rm /usr/local/bin/docker-compose
使用docker compose编排nginx+springboot
- 1、创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
- 2、编写docker-compose.yml
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- /root/nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
- 3、创建 /root/nginx/conf.d 目录
mkdir -p /root/nginx/conf.d
- 4、在conf.d目录下编写nginx.conf文件
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
-
5、在 /root/docker-compose目录下使用docker-compose 启动容器
docker-compose up -d
- 6、验证
25、docker私有仓库——搭建
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、验证:打开浏览器,输入地址 http://私服仓库IP:5000/v2/_catalog,看到{"repositries":[]}表示私服搭建成功
# 4、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步骤用于让docker信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有服务器真实ip,daemon是个json格式的文件,如果已经有配置(比如之前的镜像配置),只需要加个逗号,将下面大括号里面的内容追加到逗号后面即可。
{ "insecure-registries":["192.168.31.101:5000"] }
# 5、重启docker服务
systemctl restart docker
docker start registry
26、docker私有仓库——上传镜像
# 1、标记镜像为私有仓库的镜像: docker tag 镜像名:版本 新的名字:版本。由于需要push,新的镜像名要带着仓库信息,不打算push,这个名字可以随意起
docker tag centos:7 私有仓库服务器IP:5000/centos:7
# 2、上传标记的镜像
docker push 私有仓库服务器IP:5000/centos:7
验证:
27、docker私有仓库——拉取镜像
docker images 查看本地镜像,删除掉tag镜像。
然后拉取 docker pull 192.168.31.101:5000/centos:7
然后再次docker images看下是否拉取成功。
注意:我们看到下载时提示并没有下载,而是使用旧的已删除的做的恢复。这个不影响我们实验。