Docker学习笔记
1.初始Docker
容器技术:解决软件跨环境迁移问题
解决
- 开发
- 测试
- 生产
环境之间差异,版本+代码
1.1解决不同组件依赖的兼容性问题
1.2安装Docker
命令行安装即可
1.3Docker架构
- 客户端:
- 服务端:镜像和容器
- 仓库Registry:DockerHUB
1.3.1镜像
将应用程序及其依赖、环境、配置打包在一起
1.3.2容器
镜像运行起来就是容器,一个镜像可以运行多个容器
1.4Docker换源,换成国内镜像
2.Docker命令
可参照菜鸟教程
2.1Docker服务相关命令
2.1.1启动Docker服务
systemctl start docker
2.1.2停止Docker服务
systemctl stop docker
2.1.3重启Docker服务
systemctl restart docker
2.1.4查看Docker服务状态
systemctl status docker
2.1.5开机启动Docker服务
systemctl enable docker
2.2镜像相关命令
2.2.1查看本地镜像
docker images
2.2.2搜索远程镜像
docker search redis
2.2.3拉取远程镜像
Docker HUB 拉取相关软件的镜像
docker pull redis:3.5(3.5版本号)
2.2.4删除本地镜像
docker rmi imageid
docker rmi redis:3.5(Image id 重复时)
删除所有镜像
docker remi `docker images -q`
2.3容器相关命令
2.3.1查看容器
docker ps
查看所有容器
docker ps -a
2.3.2创建容器
方式1
docker run -i -t --name=c1 redis
-i 保持容器运行
-t 容器退出后自动关闭
方式2
docker run -id --name=c2 redis
-d 守护,后台运行容器
-- name 为容器起名
2.3.3进入容器
docker exec -it c2 /bin/bash
2.3.4启动容器
docker start c1
2.3.5停止容器
docker stop c2
2.3.6删除容器
运行的容器不可以删除
docker rm c2(容器名称)
docker rm `docker ps -aq`
2.3.7查看容器信息
docker inspect c1
3.Docker应用部署
3.1MySql部署
端口映射 -p
3.1.1搜索MySQL镜像
docker search mysql
3.1.2拉取MySQL镜像
去DockerHUb
docker pull mysql:5.6
3.1.3创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3306: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.6
$PWD
:当前路径
docker run
:就是创建并运行容器
-- name mn
:给容器起个名字叫mn
-v $PWD/conf:/etc/mysql/conf.d
:将主机目录下conf/my.cnf挂载到容器的/etc/mysql/my.cnf 配置目录
-p 8080:80
:把宿主机的8080端口映射到容器内的80端口
-e MYSQL_ROOT_PASSWORD=123456
:初始化root密码
mysql:5.6
:镜像名称
3.1.4操作容器中的MySQL
docker exec -it c_mysql /bin/bash
登录mysql
mysql -uroot -p123456
3.2Tomcat部署
3.2.1搜索Tomcat镜像
docker search tomcat
3.2.2拉取Tomcat镜像
docker pull tomcat
3.2.3创建容器,设置端口映射、目录映射
#在/root目录下创建tomcat目录用于存放tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
-p 8080:8080
:将容器的8080端口映射到主机的8080端口
-v $PWD:/usr/local/tomcat/webapps
:将主机中当前目录挂载到容器的webapps
3.2.4操作容器中的Tomcat
使用外部机器访问Tomcat
3.3Nginx部署
3.3.1搜索Nginx镜像
docker search nginx
3.3.2拉取Nginx镜像
docker pull nginx
3.3.3创建容器,设置端口映射、目录映射
#在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
#在~/nginx/conf/下创建nginx.conf文件,粘贴下面代码块的内容
vim nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
创建容器
docker -run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
-p 80:800
:将容器的80端口映射到宿主机的80端口
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf
:将主机当前目录下的/conf/nginx.conf挂载到容器的:/etc/nginx/nginx.conf配置目录
-v $PWD/html:/usr/share/nginx/html
:将主机当前目录挂载到容器的/val/log/nginx日
3.3.4操作容器中的Nginx
外部访问Nginx即可
3.4Redis部署
3.4.1搜索Redis
docker search redis
3.4.2拉取redis
docker pull redis:5.0
3.4.3创建容器
docker run -id --name=c_redis -p 6379:6379 redis:5.0
3.4.4测试访问
redis-cli.exe -h 192.168.187.129 -p 6379
-h 192.168.187.129 宿主机的ip地址
4.备份与迁移
5.Dockerfile(构建镜像)
5.1Docker镜像原理与制作
5.1.1原理
复用
分层的文件系统
5.1.2制作镜像
容器转镜像
docker commit 容器id 镜像名称:版本号
镜像不可以传输,可以将镜像转换成压缩文件
docker save -o 压缩文件名称 镜像名称:版本号
压缩文件还原成镜像
docker load -i 压缩文件名称
目录挂载的不生效
5.2DockerFile概念及作用
统一,开发、测试、运维的运行环境
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
作用
5.3案例1:定义dockerfile,发布springboot项目
5.3.1springboot项目准备
5.3.2将项目打包
根据路径找到打好的文件
5.3.2将文件传输到虚拟机
-
参照别人安装Xshell教程安装
-
使用
rz
命令进行查看是否安装了lrzsz程序 -
如果没有安装,使用
yum -y install lrzsz
进行安装 -
输入
rz
进行文件上传
5.3.4将文件移动至dockerfiles目录下
如果没有目录docker-files,先进行创建
mkdir ~/docker-files
mv springboot-hello-0.0.1-SNAPSHOT.jar ./docker-files/
5.3.5编辑dockerfile将jar包添加到镜像中
- 定义父镜像:
FROM java:8
- 定义作者信息:
MAINTAINER jqqq007 <www.jqqq007.wkl>
- 将jar包添加到容器:
ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
- 定义容器启动执行的命令:
CMD java -jar app.jar
- 通过dockerfile 构建镜像:
docker build -f dockerfile文件路径 -t 镜像名称:版本
vim springboot_dockerfile 编辑一个文件
添加以上命令
执行,就可生成镜像
docker build -f ./springboot_dockerfile -t app .
查看镜像
通过镜像app,创建运行容器
docker run -id -p 9000:8080 app
访问
5.4案例2:自定义centos7镜像
要求:
- 默认登录路径为/usr
- 可以使用vim
5.4.1查看原来的centos7挂载目录
是挂载在根目录/下
5.4.2查看原来的centos7是否带有vim
结果不带
5.4.3开始自定义自己的centos7
创建一个dockerfile
vim centos_dockerfile
添加以下命令
FROM centos:7
MAINTAINER JQ<jq.cn>
RUN yum install -y vim
WORDIR /usr
CMD/bin/bash
RUN yum install-y vim
:执行安装vim命令
WORDIR /usr
:定义默认的工作目录
CMD/bin/bash
:定义容器启动执行的命令
5.4.4构建镜像自己的镜像
通过dockerfile 构建镜像:docker build -f dockerfile文件路径 -t 镜像名称:版本
docker build -f ./centos_dockerfile -t appcentos:1
5.4.5创建容器执行
6.Docker服务编排
6.1服务编排概念
6.2Docker Compose(服务编排工具)
DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
6.3DockerCompose安装使用
#Compose 目前已经完全支持Linux、MAC OS、Windows,在安装Compose之前,需要先安装Docker。下面以编译好的二进制包方式安装在Linux中
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.0.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
#查看版本信息
docker-compose -version
卸载dockerCompose
#二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
6.4案例:DockerCompose编排Nginx+springboot项目
6.4.1创建docker-compose目录
mkdir docker-compose/
cd ~/docker-compose
6.4.2编写docker-compose.yml文件
vim docker-compose.yml
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
6.4.3创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
cd ./nginx/conf.d
6.4.4在./nginx/conf.d目录下编写itdocker.conf文件
vim itdocker.conf
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
6.4.5在~/docker-compose目录下 使用dockers-compose 启动容器
cd ~/docker-compose
docker-compose up
6.4.6测试访问
192.168.56.10:80/hello
6.4.7错误:services.nginx Additional property app is not allowed
docker-compose up
services.nginx Additional property app is not allowed
此时一定要去检查docker-compose.yml书写格式,特别是缩进格式!
7.Docker容器数据卷
7.1数据卷的概念及作用
容器与虚拟机进行目录挂载
解决
- Docker容器删除后,数据还会存在
- Docker容器与外部机器之间进行文件交换
- 容器之间的数据交换
一个容器可以被多个容器进行同时挂载
一个容易也可以被挂载多个数据卷
7.2配置数据卷
- 目录必须是绝对路径
- 目录不存在可以自动创建
- 可以挂载多个数据卷
7.2.1挂载目录
docker run -it --name=c1 -v /root/data/:/root/data_container redis:3.5
挂载多个目录
docker run -it --name=c2 \
-v /root/data:/root/dedadasdad \
-v /root/data2:/root/dadssds
7.2.2多个容器挂载同一个数据卷
docker run -it --name=c1 -v /root/data/:/root/data_container redis:3.5
docker run -it --name=c2 -v /root/data/:/root/data_container redis:3.5
7.3配置数据卷容器
7.3.1配置
自动在宿主机分配一个文件
docker run -it --name=c3 -v /volume redis:3.5
docker run -it --name=c1 --volumes-from c3 redis:3.5
docker run -it --name=c2 --volumes-from c3 redis:3.5
8.Docker私有仓库(管理自己的镜像)
8.1搭建私有仓库(注意ip变化)
8.1.1拉取私有仓库镜像
docker pull registry
8.1.2启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
8.1.3打开浏览器 访问私有仓库
输入地址https://私有仓库服务器ip:5000/v2/_catalog
看到{“repositories”:[]}表示私有仓库搭建成功
8.1.4修改deamon.json
vim /etc/docker/daemon.json
#在上述文件中添加一个key,保存退出。
#此步用于让docker信任私有仓库地址
#注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries": ["私有仓库服务器ip:5000"]}
8.1.5重启docker 服务与registry仓库
systemctl restart docker
docker start registry
8.2上传镜像到私有仓库
8.2.1标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器ip:5000/centos:7
8.2.2上传标记的镜像
docker push 私有仓库服务器ip:5000/centos:7
8.3从私有仓库拉取镜像
#拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7
9.Docker容器虚拟化与传统虚拟机比较