认识Docker
Docker定义
Docker 是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制( 沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响 ),相互之间不会有任何接口,更重要的是容器性能开销极低。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。
镜像就类似于在创建虚拟机前需要下载的系统镜像文件,比如iso文件、img文件等一些镜像文件。
容器可以类比于正在运行中的虚拟机。
Docker优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
Docker配置
安装docker
#1.卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.需要的安装包
yum install -y yum-utils
#3.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#默认是从国外的,不推荐
#推荐使用国内的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io
#6. 使用docker version查看是否按照成功
docker version
#7. 测试
docker run hello-world
卸载docker
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!
配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://92hysgko.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker基础命令
启动docker systemctl start docker
关闭docker systemctl stop docker
重启docker systemctl restart docker
查看docker版本信息 docker version docker info
docker镜像命令
查看自己服务器中docker 镜像列表
docker images
-a 列出本地所有的镜像
-f 显示满足条件的镜像
-q 只显示镜像ID
搜索镜像
docker search 镜像名
docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像
拉取镜像
docker pull 镜像名
docker pull 镜像名:tag
运行镜像
docker run 镜像名
docker run 镜像名:Tag
删除镜像 ------当前镜像没有被任何容器使用才可以删除
#删除一个
docker rmi -f 镜像ID
#删除多个
docker rmi -f 镜像ID 镜像ID 镜像ID
#删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
commit镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker容器命令
新建容器并启动
docker run [可选参数] image
# 参数说明
--name = "Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
-p 随即指定端口
查看容器
docker ps [参数]
# 参数说明
# 列出当前正在运行的容器
-a # 列出当前 + 历史运行过的容器
-n = ? # 列出最近n个创建的容器
-q # 只显示容器编号
退出容器
exit # 容器停止并退出
ctrl + p + q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定容器,-f强制删除
docker rm $(docker ps -aq) # 删除所有容器
启动和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id # 强制停止
查看日志
docker logs [参数] 容器id
# 参数说明
-f # 跟踪日志输出
--since # 显示某个开始时间的所有日志
-t # 显示时间戳
--tail # 列出最新n条容器日志
docker logs -f -t
docker logs -f -t --tail 条数 容器id
查看容器中进程信息ps
docker top 容器id
查看镜像的元数据
docker inspect 容器id
进入当前正在运行容器
docker exec -it 容器id /bin/bash # 进入容器后开启一个新的终端,可以在里面操作
docker attach 容器id # 进入容器正在执行的终端,不会启动新的进程
拷贝容器文件到主机上
docker cp 容器id:容器内路径 目的主机路径
容器数据卷
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
容器的持久化和同步操作,容器间的数据共享
挂载
# 匿名挂载 (只写了容器内的路径,生成随机卷名)
docker run -d -v 容器内目录
# 查看所有的volume的情况
docker volume ls
# 具名挂载
docker run -d -v 卷名:容器内目录 镜像名/id
# 指定路径挂载 docker volume ls 是查看不到的
-v /宿主机路径:容器内路径
# 未指定主机内目录时使用默认路径
/var/lib/docker/volumes/卷名/_data
容器挂载权限
# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
Dockerfile
常用指令
# DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指
令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
CMD 和 ENTRYPOINT区别
1.如果在dockerfile里出现多个CMD,只有最后一个CMD会生效
2.docker run + command会覆盖cmd参数
3.CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖
tomcat示例
FROM centos #
MAINTAINER pan3535<2905858092@qq.com>
COPY README /usr/local/README #复制文件
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制解压
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制解压
RUN yum -y install vim
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是:
EXPOSE 8080 #设置暴露的端口
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apachetomcat-9.0.35/logs/catalina.out # 设置默认命令
build镜像、更改镜像名称、push镜像
一般命令为账号+名称+版本号 pan3535/xxx:v1.0
# 通过Dockerfile文件build镜像
docker build -f 文件路径 -t 镜像名 . # 文件名为Dockerfile时可省略且最后的.不要忽略
# 更改镜像名称
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 登录hub
docker login -u pan3535
docker logout
# push镜像
docker push 镜像名称 # 默认dockerhub,命名需要规范
push到阿里云镜像仓库
Docker网络命令
–link(不建议使用)
本质就是在hosts配置中添加映射
自定义网络,不适用docker0
docker0问题:不支持容器名连接访问
docker run -d -P --link 容器名A/id 容器名B/id 镜像名/id
示例:docker run -d -P --name tomcat03 --link tomcat02 tomcat
tomcat03可以ping通tomcat02,反之不行
通过docker network inspect 容器id 查看信息可知本质是hosts映射
自定义网络
docker network
connect -- 连接一个容器到网络
create -- 创建网络
disconnect -- 断开一个容器与网络之间的连接
inspect -- 查看一个网络信息
ls -- 查看所有网络
prune -- 移除所有未使用网络
rm -- 删除一个或多个网络
网络模式
bridge :桥接 docker(默认,自己创建也是用bridge模式)
none :不配置网络,一般不用
host :和所主机共享网络
container :容器网络连通(用得少!局限很大)
# 创建网络
docker network create --driver 网络模式 --subnet 子网ip --gateway 网关 网络名
示例:docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 不同网络之间容器无法通过容器名访问
docker network connect 网络名 容器名/id
redis集群示例
# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个redis配置
for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 通过脚本运行六个redis
for port in $(seq 1 6);\
docker run -p 637${port}:6379 -p 1667${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server
/etc/redis/redis.conf
docker exec -it redis-1 /bin/sh #redis默认没有bash
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379
172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
SpringBoot打包Docker镜像
1.打包成jar
mvn package
2.编写Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
3.构建镜像
# 1.复制jar和Dockerfile到服务器
# 2.构建镜像
docker build -t xxxxx:xx .
4.发布运行
以后我们使用了Docker之后,给别人交付就是一个镜像即可!