美文网首页
Docker从零开始发布应用(1)-构建第一个容器

Docker从零开始发布应用(1)-构建第一个容器

作者: bclz | 来源:发表于2019-07-25 16:07 被阅读0次

一、概述与入门(安装和配置)[1]

官方文档: https://docs.docker.com/

Docker众所周知,方便了运维成本,有一次编译到处运行的说法
  • Docker安装前提:
  Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。 
  Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本
  CentOS 7 的内核一般都是3.10的,而CentOS 6.X 的内核一般都是2.6,在2.6的内核下,Docker运行会比较卡,所以一般会选择升级到3.10版本。

eg:如果是低内核,需要升级,升级步骤:

     #升级内核版本(包含aufs)
     cd /etc/yum.repos.d
     wget http://www.hop5.in/yum/el6/hop5.repo
     yum install kernel-ml-aufs kernel-ml-aufs-devel
     
     #修改引导的内核
     vi /etc/grub.conf
     # 把默认的引导文件设置为0。因为升级内核之后,新的内核在第一个(0)位置。

1. 安装上centos7之后,所有的命令最好用sudo,配置sudo,接下来将yum更新到最新

 sudo yum update -y
 sudo yum -y install docker
 sudo systemctl start docker
 #查看docker版本
 sudo docker version
 #设置为开机启动
 sudo systemctl enable docker

2. 配置docker用户组

背景: 在Linux上,当您运行任何docker命令时,docker二进制文件将尝试连接/var/run/docker.sock。正如它的.sock扩展所示,这个文件是一个Unix域套接字 - 基本上,这是多个进程可以在本地计算机上通信的一种方式(也称为IPC机制 - IPC =“进程间通信”)。

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

# 建立 docker 组:
sudo groupadd docker

# 将当前用户加入 docker 组:
sudo usermod -aG docker $USER

# 退出当前终端并重新登录,进行如下测试。
#校验是否按照成功, 会有  Hello from Docker!显示
[xuchang@localhost opt]$ docker run hello-world

//如果执行无权限
//Got permission denied while trying to connect to the Docker daemon socket at unix
//执行 sudo systemctl restart docker

3. 配置镜像地址(这里使用的是阿里的镜像地址)

阿里镜像比较快,登陆阿里镜像控制台,注册账号,点击左侧菜单镜像加速器,里面有用户专属的镜像地址。

sudo vim /etc/docker/daemon.json

{

"registry-mirrors": ["http://xxx.mirror.aliyuncs.com"],
"hosts": ["tcp://192.168.243.195:2375", "unix:///var/run/docker.sock"]

}
#registry-mirrors指定镜像地址
#hosts指定通信地址, 192.168.243.195本地Ip
#重启
sudo systemctl daemon-reload
sudo systemctl restart docker

4. 拉取基础镜像

//可以选择镜像centos版本,默认是latest
// docker pull <image_name>:<image_tag>
sudo docker pull centos

二、使用Dockfile构建第一个定制镜像[2]

1. 常用的Dockfile指令

comand describe
FROM 指定基础镜像,第一条指令
RUN 执行命令
COPY 复制文件
ADD 更高级的复制文件
CMD 容器启动命令
ENTRYPOINT 入口点
ENV 设置环境变量
ARG 构建参数
VOLUME 定义匿名卷
EXPOSE 声明端口
WORKDIR 指定工作目录
HEALTHCHECK 健康检查
ONBUILD "懒加载"其它指令,只有以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行

详细介绍

2. 编写Dockfile文件(构建jdk8环境的定制镜像和ssh)

#指定基础镜像
FROM centos
# 作者
MAINTAINER xuchang

# Install libs
# 执行shell命令
RUN yum clean all \
    && yum -y update \
    && yum install -y deltarpm rpm make wget tar unzip \
         gcc gcc-c++ \
    && mkdir -p /opt/soft/
# ADD如果 <源路径> 为一个 tar 压缩文件的话,
# 压缩格式为 gzip, bzip2 以及 xz 的情况下,
# ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去
ADD jdk-8u171-linux-x64.tar.gz /opt/soft/
# 配置容器环境变量
ENV JAVA_HOME=/opt/soft/jdk1.8.0_171
ENV PATH=$JAVA_HOME/bin:$PATH

# open ports
# 指令是声明运行时容器提供服务端口,
# 这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
# 使用docker run -P 时,会自动随机映射 EXPOSE 的端口
EXPOSE 22

3. 编译镜像

[xuchang@localhost jdk1.8]$ ls
Dockerfile  jdk-8u171-linux-x64.tar.gz
# .表示当前目录
[xuchang@localhost jdk1.8]$ docker build -t centos7-jdk1.8 .
Sending build context to Docker daemon 190.9 MB
Step 1/7 : FROM centos
 ---> 9f38484d220f
Step 2/7 : MAINTAINER xuchang
 ---> Running in ec42251bfc5e
 ---> 491d68bd0b9a
Removing intermediate container ec42251bfc5e
Step 3/7 : RUN yum clean all     && yum -y update     && yum install -y deltarpm rpm make wget tar unzip          gcc gcc-c++     && mkdir -p /opt/soft/
 ---> Running in 710f74dcfba7
...
...
Complete!
 ---> d968aee98bb8
Removing intermediate container 710f74dcfba7
Step 4/7 : ADD jdk-8u171-linux-x64.tar.gz /opt/soft/
 ---> 9fd38879067b
Removing intermediate container d743fba970b5
Step 5/7 : ENV JAVA_HOME /opt/soft/jdk1.8.0_171
 ---> Running in 4c82a1d8665f
 ---> 2bef55ddeb5f
Removing intermediate container 4c82a1d8665f
Step 6/7 : ENV PATH $JAVA_HOME/bin:$PATH
 ---> Running in aa6ea31dc9b2
 ---> 187365786087
Removing intermediate container aa6ea31dc9b2
Step 7/7 : EXPOSE 22
 ---> Running in 48616940b48d
 ---> ee8cf5f337df
Removing intermediate container 48616940b48d
Successfully built ee8cf5f337df


[xuchang@localhost jdk1.8]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7-jdk1.8      latest              ee8cf5f337df        12 seconds ago      867 MB
docker.io/centos    latest              9f38484d220f        4 months ago        202 MB

centos7-jdk1.8镜像构建完成!!!

4. 构建centos7-base镜像

  • 再进一步构建,添加ssh、supervisord(一种Linux监控进程工具)功能
//Dockfile
FROM centos7-jdk1.8
MAINTAINER xuchang
# supervisor 通过脚本进行多应用的启动
# 使用yum install python-setuptools -y来安装supervisor
RUN yum -y update \
    && yum install -y passwd openssh-server openssh-clients initscripts net-tools \
    && yum install python-setuptools -y \
    && easy_install supervisor \
    && echo 'root:root' | chpasswd \
    && /usr/sbin/sshd-keygen
EXPOSE 22
#以后台守护进程方式运行服务器
CMD /usr/sbin/sshd -D
  • 编译构建
[xuchang@localhost ssh]$ docker build -t centos7-base .
  • 构建完成后
[xuchang@localhost ssh]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
centos7-base        latest              3a3cfafe73fd        About a minute ago   1.2 GB
centos7-jdk1.8      latest              ee8cf5f337df        About an hour ago    867 MB
docker.io/centos    latest              9f38484d220f        4 months ago         202 MB

三、创建网络[3]

当创建一个网络时,Engine默认为这个网络创建一个不重叠的子网。这个子网不是现有网络的细分。 它纯粹是为了寻址目的。可以直接使用--subnet选项来覆盖这个默认行为并指定一个子网。

docker network create --subnet=192.168.10.0/24 bclz

\color{red}{注意事项}[4]

  1. EXPOSE {port}
    Dockerfile中该指令只是声明暴露该端口,
    使用 run -d {containerId} 运行镜像为容器时,该port端口并不可以访问,使用以下方式可以时宿主机可以访问:
//1.随机映射宿主机端口(  添加-P参数),会使用宿主机随机端口对EXPOSE声明了的端口进行映射,
//比如EXPOSE 8080,宿主机随机端口0.0.0.0:32768->8080/tcp,就可以在宿主机上通过32768访问 docker容器的8080端口了
docker run -d -P  {containerId}

//2.指定宿主机端口和容器端口映射(  添加-p {宿主机端口:容器端口}),32768:8080这种形式
docker run -d -p 32768:8080  {containerId}

  1. 关于VOLUME挂载

是将宿主机的路径挂载到容器路径中,是一种覆盖行为
\color{red}{并且在dockerfile中挂载VOLUME之后,RUN执行的改变挂载目录权限命令是没有作用的}


  1. 概述与入门

  2. 使用Dockfile构建第一个容器

  3. 创建网络

  4. 注意事项

相关文章

  • Mac Docker 创建第一个Django 应用,Part 1

    Mac Docker 创建第一个Django 应用,Part 2 用Mac快速构建Django 容器 [摘录译] ...

  • Docker从零开始发布应用(1)-构建第一个容器

    一、概述与入门(安装和配置)[1] 官方文档: https://docs.docker.com/ Docker安装...

  • Docker 容器的网络

    如果你通过 Docker 提供的用户指南,你应该已经完成了构建你的第一个 Docker 容器,并且运行了示例应用。...

  • 搭建我的第一个Docker应用栈

    参照《Docker容器与容器云》第2.3节来搭建我的第一个Docker应用栈。 1.获取应用栈各节点所需镜像 2....

  • Docker 引擎概述

    Docker Engine 是一个开源的容器技术,被用来对你的应用进行容器化构建。 Docker Engine 实...

  • ASP.NET Core使用Docker-Stack服务编排实现

    一、课程介绍 我们都知道docker有docker-compose容器编排很方便构建和部署我们的单机应用容器镜像,...

  • Docker应用场景

    应用程序打包和发布 应用程序可以打包成Docker镜像,发布在测试环境或生产环境的Docker容器里。 应用程...

  • 101、镜像的构建

    1、镜像构建方式 1.1、docker commit 运行容器 对容器进行修改 通过docker commit 把...

  • Docker笔记

    1、Docker简介 开源的应用容器引擎 打包环境和应用到一个轻量级,可移植的容器中,发布到任何 Linux 机器...

  • docker的学习

    Docker 打包到容器,发布到linux实现虚拟化 Docker 容器是一个开源的应用容器引擎,让开发者可以打包...

网友评论

      本文标题:Docker从零开始发布应用(1)-构建第一个容器

      本文链接:https://www.haomeiwen.com/subject/fmztrctx.html