一文精通Docker安装部署发布

1,438 阅读3分钟

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

容器生命周期

image.png

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 : 容器启动后执行默认的命令或参数 image.png

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网桥双向通信

介绍

image.png

实现原理

image.png

命令

  • 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