写点什么

Docker

用户头像
彭阿三
关注
发布于: 2 小时前

hub.docker.com //镜像地址

Docker 安装

//安装yum工具包 yum-utils 数据存储驱动device-mapper-persistent-data 和lvm2yum 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/dockersudo tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"] //加速器地址}EOFsudo systemctl daemon-reloadsudo 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> 镜像名:<tags> - 删除镜像

宿主机与 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
#查看容器IPdocker 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 "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-(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: wordpressvolumes: db_data: {}
复制代码


编译 yml 文件docker-compose up -d

实战

构建 Dockerfile

构建 web 容器


FROM openjdk:8u222-jreWORKDIR /usr/local/webappADD ucas.jar .ADD application.ymlEXPOSE 80CMD ["java","-jar","ucas.jar"]
复制代码


创建镜像docker build -t pengasan.com/ucas-web .


运行docker run pengasan.com/ucas-web


创建数据库容器


FROM mysql:5.7WORKDIR /docker-entrypoint-initdb.dADD 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
复制代码


用户头像

彭阿三

关注

java工程师 2019.06.28 加入

一个慵懒的程序员。

评论

发布
暂无评论
Docker