docker部署与dockerfile

应用的部署

  1. 搜索app的镜像
  2. 拉去app的镜像
  3. 创建容器
  4. 操作容器中的app

MySql的部署

  • 容器内的网络服务和外部机器无法直接通信
  • 外部机器和宿主机可以直接通信、
  • 宿主机和容器可以直接通信
  • 容器中的服务需要被外部访问时,可以将 容器中提供服务的端口映射到宿主机的端口上,外部访问宿主机的端口,就能间接访问容器服务
  • 称为 端口映射
  1. 搜索mysql镜像

    1
    sudo docker search mysql
  2. 拉取镜像

    1
    sudo docker pull mysql
  3. 创建容器,设置端口映射,目录映射

    1
    2
    mkdir mysql
    cd mysql
    1
    2
    3
    4
    5
    6
    7
    8
    ➜  mysql sudo docker run -id \   
    > -p 3307: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
  • 参数说明

    • -p 3307:3306将容器的3306端口映射到宿主机的3307端口
    • -v $PWD/conf:/etc/mysql/conf.d :将主机当前目录下的 conf挂载到容器的 /etc/mysql/conf.d上,配置文件
    • -v $PWD/logs:/logs :将当前主机目录下的logs挂载到容器的logs,日志目录
    • -e MYSQL_ROOT_PASSWORD=123456: 初始化root用户密码
  • 使用

    正常的使用mysql

  • 本地访问到docker中的mysql 数据库

    1
    sudo mysql -uroot -P 3307 -h 127.0.0.1 -p

Tomcat的部署

和上述mysql部署类似

1
docker run -id --name=c_tomcat -p 8080:8080 -v $PWD:/usr/local/tomcat/webapps tomcat

dockerfile

Docker原理

  1. Docker 镜像本质是

    一个分层的文件系统

  2. Docker中的一个centos镜像为什么只有200mb,而一个centos操作系统的iso文件要几个G

    centos的ios镜像文件包含了 rootfsbootfs,而docker的centos镜像复用了操作系统的bootfs,只有 rootfs和其他镜像层

  3. docker中一个tomcat镜像为什么有500mb,而一个tomcat安装包只有70mb

    docker中镜像是分层的,分层下载,tomcat只有70多mb,但是他还需要依赖父镜像和基础镜像,所以对外暴露出tomcat镜像有500多

镜像的制作

容器转镜像

  1. 容器转镜像

    目录挂载的是不会写道commit镜像里面去

    1
    docker commit 容器id 镜像名称:版本号
  2. 将镜像打包成压缩文件

    1
    docker save -o 压缩文件名称 镜像名称:版本号
  3. 将压缩文件解压

    1
    docker load -i 压缩文件名称
  4. 我们将自己的实现的应用转化成一个镜像,将其转化成一个压缩文件,传给别人,别人使用这个镜像,生成对应的容器,就能够在自己那边部署使用该应用了

Dockerfile

Dockerfile概念

  • Dockerfile是一个文本文件
  • 里面包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 可以给别人提供一个完全一致的开发环境

我们可以登陆hub.docker.com查看别人是怎么写dockerfile的

关键字 作用 备注
FROM 指定父镜像 指定dockerfile是基于哪个 image构建的
MAINTAINER 作者信息 表明谁写的
RUN 执行命令 容器创建的过程中执行,格式:RUN command
如:RUN yum install-y vim ,进入后自动安装
vim
CMD 容器启动命令 CMD command param1 pararm2
用于设置部署容器实例是运行的默认命令
CMD /bin/bash
ENTRYPOINT 入口 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。
ADD 添加文件 ADD src dst
添加src 文件到dst路径下,同时还能 解压
ENV 环境变量 ENV==
ARG 构建参数
WORKDIR 工作目录 进入容器的默认目录
WORKDIR /usr
EXPOSE 端口 使容器内的应用可以通过端口和外界交互
EXPOSE 80

书写完dockerfile时

1
docker build -f ./centos_file -t ccc:1 .
  • -f:指定dockerfile的文件路径
  • -t:指定镜像的名称和版本号

示例

1
2
3
mkdir docker
cd docker
vim test.cpp

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
using namespace std;

int main()
{
char op;
float num1, num2;

cout << "输入运算符:+、-、*、/ : ";
cin >> op;

cout << "输入两个数: ";
cin >> num1 >> num2;

switch(op)
{
case '+':
cout << num1+num2;
break;

case '-':
cout << num1-num2;
break;

case '*':
cout << num1*num2;
break;

case '/':
if (num2 == 0)
{
cout << "error不能除以零";
break;
}
else
{
cout << num1 / num2;
break;
}

default:
// 如果运算符不是 +, -, * 或 /, 提示错误信息
cout << "Error! 请输入正确运算符。";
break;
}

return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim my.dockerfile
//输入
FROM codenvy/cpp_gcc

RUN mkdir /home/user/myapp

ADD test.cpp /home/user/myapp

WORKDIR /home/user/myapp

RUN g++ test.cpp -o test

CMD ["./test"]


运行

1
2
3
4
docker build -f ./my.dockerfile -t my:1.0 .
docker images
docker run -it my:1.0 /bin/bash

服务编排

原理:

可能在一个应用中包含了若干个应用,如mysql,redis之类的

所以,可以按照一定的业务规则批量的管理容器

Docker Compose

Docker Compose是一个编排 多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止

  1. 利用Dockerfile定义运行环境镜像
  2. 使用docker-compose.yml定义组成应用的各服务
  3. 运行docker-compose up 启动应用

安装docker-compose

Docker 私有仓库

  1. 拉取私有仓库镜像

    1
    docker pull registry
  2. 启动私有仓库容器

    1
    2
    docker run -id --name=registry -p 5000:5000 registry

  3. 打开浏览器,输入 私有仓库ip:5000/v2/_catalog 可以看到 {"repositories":[]} 表示私有仓库搭建成功

  4. 修改daemon.json

    1
    2
    3
    sudo vim /etc/docker/daemon.json
    //添加
    "insecure-registries":["私有服务器ip:5000"]
  5. 重启docker服务

    1
    2
    systemctl restart docker
    docker start registry
  • 将镜像上传到私有仓库

    • 标记镜像为私有仓库的镜像

      1
      docker tag wxm:1.0 192.168.0.22:5000/wxm:1.0
    • 推送镜像到远程仓库

      1
      docker push 192.168.0.22:5000/wxm:1.0
  • 从私有仓库拉取镜像

    1
    docker pull 192.168.0.22:5000/wxm:1.0

docker部署与dockerfile
http://example.com/2023/01/22/docker部署/
作者
Zevin
发布于
2023年1月22日
许可协议