Docker
hub.docker.com //镜像地址
Docker安装
//安装yum工具包 yum-utils 数据存储驱动device-mapper-persistent-data 和lvm2
yum install -y yum-utils device-mapper-persistent-data lvm2
//修改yum安装源,默认在国外下载慢
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//自动检测优质的安装源
yum makecache fast
//安装
yum -y install docker-ce
启动验证
//启动命令
service docker start
//查看版本
docker version
//验证是否可用,从国外中央仓库拉到本地
docker pull hello-world
//运行一下,验证是否成功
docker run hello-world
阿里云Docker镜像加速
通过阿里云的加速服务来加速访问国外仓库的操作 需要去阿里云开通服务
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"] //加速器地址
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
//拉去tomcat验证是否成功
docker pull tomcat
Docker常用命令
- docker pull 镜像名<:tags> - 从远程仓库抽取镜像 eg.docker pull tomcat:9.0-jdk8-adoptopenjdk-openj9
- docker images - 查看本地镜像
- docker run 镜像名<:tags> - 创建容器,启动应用
- docker ps - 查看正在运行中的镜像
- docker stop 容器id 停止容器
- docker rm <-f(强制)> 容器id - 删除容器
- docker rmi <-f> 镜像名: - 删除镜像
宿主机与Docker容器通讯
client不能直接访问docker,需要访问宿主机然后映射到docker服务
配置映射关系并启动docker容器
- docker run -p 8000:8080 tomcat
- docker run -p 8000:8080 -d tomcat 后台运行
在容器中执行命令
- 格式:docker exec [-it] 容器id 命令
- exec 在对应容器中执行命令
- -it 采用交互方式执行命令
- 实例:docker exec -it 0738ed2fe68b /bin/bash
容器生命周期
Dockerfile构建镜像
介绍
Dockerfile是一个包含用于组合镜像的命令的文本文档 Docker通过读取Dockerfile中的指令按步自动生成镜像
命令
FROM tomcat:latest //设置基础景象
MAINTAINER pengasan.com //设置当前景象的拥有者
WORKDIR /usr/local/tomcat/webapps //切换工作目录
ADD docker-web ./docker-web //复制docker-web 复制到容器docker-web
- docker build -t 机构/镜像名<:tags> Dockerfile目录 //构建自定义镜像
- eg. docker build -t pengasan.com/mywebapp:1.0
Dockerfile基础命令
- FROM centos #制作基准镜像(基于centos:lastest)
- LABEL & MAINTAINER - 说明信息
- MAINTAINER pengasan.com
- LABEL version = "1.0" ,LABEL description = "商城的项目"
- WORKDIR - 设置工作目录
- WORKDIR /usr/local ,WORKDIR /usr/local/newdir #自动创建
- ADD & COPY - 复制文件
- ADD hello / #复制到根路径
- ADD test.tar.gz / #添加根目录并解压
- ADD 除了复制,还具备添加远程文件功能
- ENV - 设置环境常量
- ENV JAVA_HOME /usr/local/openjdk8
- RUN ${JAVA_HOME}/bin/java -jar test.jar
- EXPOSE - 暴露容器端口 仅仅是声明
- EXPOSE 8080
- docker run -p 8000:8080 tomcat
Dockerfile运行命令
- RUN : 在Build构建时执行命令
- ENTRYPOINT : 容器启动时执行的命令
- CMD : 容器启动后执行默认的命令或参数
RUN构建时运行
- RUN yum install -y vim #Shell 命令格式
- RUN ["yum","install","-y","vim"] #Exec命令格式 官方推荐用这个方式
ENTRYPOINT启动命令
- ENTRYPOINT(入口点)用于在容器启动时执行命令
- Dockerfile中只有最后一个ENTRYPOINT会被执行
- ENTRYPOINT ["ps"] #推荐使用Exec格式
CMD默认命令
- CMD用于设置默认执行的命令 (默认命令 如果启动命令中有附加命令会被覆盖)
- 如Dockerfile中出现多个CMD,则只有最后一个被执行
- 如容器启动时附加指令,则CMD被忽略
- CMD ["ps" , "-ef"] #推荐使用Exec格式
容器间Link单向通信
容器每次创建会都会被赋予一个ip,这个ip是动态的,当然我们容器间使用ip是天然可用通讯的但是一旦重新启动ip就会改变,这样是我们的日常工作难度大大增加,所以我们使用link通讯优化这个问题
docker run -d --name web tomcat
# -it /bin/bash 为了让容器可见,默认创建后就退出了
docker run -d --name database -it centos /bin/bash
#查看容器IP
docker inspect 容器ID/名称
#创建容器时候我们直接使用link命令使用容器间可用使用名称通讯,这个内部是由docker管理的
docker run -d --name web --link database tomcat
Bridge网桥双向通信
介绍
实现原理
命令
- docker network ls //查看网络服务
- docker network create -d bridge my-bridge //创建一个自定义网桥
- docker network connect my-bridge[网桥名称] web[容器名称] //容器绑定网桥
所有绑定一个网桥的容器之间都是能互相通讯的。
Volume容器间共享数据
背景
如果一个容器中的数据发生了改变,我们不需要挨个容器去手动更新数据,直接利用volume源数据让其他容器进行读取数据
挂载宿主机命令
第一种方式 (-v的方式)
- 格式:docker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名
- 实例:docker run --name tomcat1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat
第二种方式 (通过共享容器内挂载点)
- 创建共享容器:docker create --name webpage -v /webapps:/tomcat/webapps tomcat /bin/true
- 共享容器挂载点:docker run --volumes-from webpage --name t1 -d tomcat
Docker Compose
容器编排工具 单机多容器部署工具,集群的话需要其他工具 例如k8s 通过yml文件定义多容器部署
安装
- sudo curl -L "github.com/docker/comp… -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- sudo chmod +x /usr/local/bin/docker-compose
部署
编写yml构建脚本
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
编译yml文件
docker-compose up -d
实战
构建Dockerfile
构建web容器
FROM openjdk:8u222-jre
WORKDIR /usr/local/webapp
ADD ucas.jar .
ADD application.yml
EXPOSE 80
CMD ["java","-jar","ucas.jar"]
创建镜像
docker build -t pengasan.com/ucas-web .
运行
docker run pengasan.com/ucas-web
创建数据库容器
FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ADD init-db.sql .
创建镜像
docker build -t pengasan.com/ucas-db .
运行
docker run -d -e MYSQL_ROOT_PASSWORD=root pengasan.com/ucas-db
DockerCompose 一键发布
命令格式:docker-compose.yml
version: '3.3'
services:
db:
build: ./ucas-db/ //利用ucas-db下的dockerfile文件build
restart: always //自动重启
environment:
MYSQL_ROOT_PASSWORD: root //增加环境变量修改了root密码
app:
build: ./ucas-web/
depends_on:
- db
ports:
- "80:80"
restart: always