docker环境搭建及dockerfile编写

docker环境搭建及dockerfile编写

    • docker搭建前准备
    • 1 docker安装
      • 1.1 使用yum命令卸载老版本
      • 1.2 更新yum源为阿里云
      • 1.3 安装docker
      • 1.4 启用docker
      • 1.5 docker镜像加速
    • 2 dockerfile编写
      • 2.1 拉取镜像
      • 2.2 dockerfile编写
      • 2.3 编译镜像
      • 2.4 注意点
      • 2.5 启动脚本和启动容器
      • 2.6 进入容器
    • 后记

docker搭建前准备

建议先看看docker的文档,了解docker镜像、容器、仓库的基本概念。
参见转载:https://yeasy.gitbooks.io/docker_practice/content/introduction/what.html

1 docker安装

我安装docker的机器是centos7.6的虚拟机,所以会使用yum安装docker,另外权限不够的,请加sudo在命令前执行命令。

1.1 使用yum命令卸载老版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

1.2 更新yum源为阿里云

因为网络问题,访问国外yum源网络网速不理想,所以先更新为国内yum源。

#安装wget工具
yum -y install wget
#下载aliyun的yum源,并覆盖原来的
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#解决mirrors.cloud.aliyuncs.com的报错等待(不解决并不影响使用)
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
#更新yum缓存
yum makecache
yum -y update

1.3 安装docker

# 安装依赖包
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2
# 安装docker-ce
yum makecache fast #上面重建了缓存的话,这里就可不需要
yum install docker-ce

1.4 启用docker

#启用docker自启动
systemctl enable docker
systemctl start docker
#建立doucker用户组,将当前用户加入docker用户组
groupadd docker
usermod -aG docker $USER

测试 Docker 是否安装正确

 docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

若能正常输出以上信息,则说明安装成功。

1.5 docker镜像加速

我选择的是阿里云的镜像加速

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
     
  "registry-mirrors": ["https://cnr3t036.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

2 dockerfile编写

编写dockerfile前,需要确定你是基于什么镜像上丰富完善的镜像,一般我们可以选择空镜像、centos、ubuntu等等,这里我选的是centos。

2.1 拉取镜像

命令和参数:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]。
因为我们配置了镜像加速,并且用的是镜像仓库中已有的镜像,所以可以直接拉取镜像,不用传入地址端口。
pull前,也可以通过search命令查找是否存在镜像。

#搜索镜像
docker  search  centos
#拉取镜像
docker pull centos:latest
#镜像查看
docker images #查看所有
docker images centos #限定查看
#删除镜像
docker image rm centos
#删除镜像 
docker rmi centos 

2.2 dockerfile编写

拉取centos镜像后,我们要在里面安装jdk、tomcat、nginx,设定挂载真实机器的目录(输出日志、存放html、war包等)、设定端口映射等等一系列工作,这里我就不写具体的脚本编写调试过程。可以参考:https://yeasy.gitbooks.io/docker_practice/content/image/build.html
奉上我自己完成后的dockerfile:

#基础镜像
FROM centos:latest
#作者
MAINTAINER crazy_moore

#设置环境变量
ENV JAVA_HOME /usr/lib/jvm/java
ENV CATALINA_HOME /usr/local/soft/tomcat/apache-tomcat-9.0.24
ENV PATH /usr/local/nginx/sbin:$PATH:$CATALINA_HOME/bin:$JAVA_HOME/bin

# 执行run命令
#更新yum源
RUN yum -y install wget \
    && wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
    && sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo \
    && yum makecache \
    && yum -y update \
    #设置临时工作目录
    && mkdir -p /docker_init_tmp/ \
    && cd /docker_init_tmp/ \
    #下载jdk/nginx/tomcat
    && wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.24/bin/apache-tomcat-9.0.24.tar.gz \
    && wget http://nginx.org/download/nginx-1.17.3.tar.gz \
    # 安装JDK
    && yum -y install java-1.8.0-openjdk-devel \
    # 安装tomcat
    && mkdir -p /usr/local/soft/tomcat \
    && tar xzf /docker_init_tmp/apache-tomcat-9.0.24.tar.gz -C /usr/local/soft/tomcat \
    # 安装nginx
    && mkdir -p /usr/local/soft/nginx \
    && tar xzf /docker_init_tmp/nginx-1.17.3.tar.gz -C /usr/local/soft/nginx  \
    && yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel \
    && yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel \
    && useradd -M -s /sbin/nologin nginx \
    && cd /usr/local/soft/nginx/nginx-1.17.3/ \
    && ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module \
    && make \
    && make install \
    #修改时区
    && echo "Asia/Shanghai" > /etc/timezone \
    #清理临时文件夹
    && rm -rf /docker_init_tmp

#标记会开放的端口
EXPOSE 80
EXPOSE 8085
#设定工作目录,启动容器(初始化)时需要做目录映射。
WORKDIR /app/scripts/
CMD ["./start.sh"]

2.3 编译镜像

编译命令

docker build -t kuoxu_centos:0.0.1 .

编译有问题时,大家可以根据提示去解决脚本中存在的问题。
同时对编译失败或不需要的镜像、容器的清理命令如下:

#查看所有镜像
docker images
#查看所有容器
docker container ls
# 删除所有未启动的容器
docker container prune 
#删除指定容器
docker container rm [容器名称|容器id]
#删除镜像
docker rmi [镜像id|镜像名称]
docker image rm [镜像id|镜像名称] 

2.4 注意点

  • dockerfile中每一个指令都会建立一层镜像(对上个结果的保存),所以为了减少镜像文件的大小和内部逻辑的清晰,建议简化docker指令。
  • 镜像中,如果需要启动多个不同的服务(tomcat、nginx等),建议写成sh脚本,然后用CMD指定执行这个sh脚本即可。
  • dockerfile的启动一定要设置守护线程,不然会导致容器执行完命令就自动关闭了。

2.5 启动脚本和启动容器

启动前,我们需要将真实机器上的对应目录建立,后续的配置文件、启动脚本存放到对应目录即可。

mkdir -p /logs/nginx /logs/tomcat /web/tomcat /web/html /web/resources /app/scripts

启动脚本:

#!/bin/sh
#复制配置文件
rm /usr/local/soft/tomcat/apache-tomcat-9.0.24/conf/server.xml
cp -r /app/scripts/server.xml /usr/local/soft/tomcat/apache-tomcat-9.0.24/conf/
cp -r /app/scripts/nginx.conf /usr/local/nginx/conf/
#启动tomcat
/usr/local/soft/tomcat/apache-tomcat-9.0.24/bin/startup.sh
#启动nginx
nginx -g "daemon off;"

启动脚本的内容就是这些,里面的nginx.conf和tomcat的server.xml大家用自身的即可。

启动容器:

docker run -itd --name kuoxu_centos1 -p 8080:8085 \
 -p 80:80 \
 -v /logs/nginx:/var/log/nginx \
 -v /logs/tomcat:/usr/local/soft/tomcat/apache-tomcat-9.0.24/logs \
 -v /web/html:/web/html \
 -v /web/tomcat:/web/tomcat \
 -v /web/resources:/web/resources  \
 -v /app/scripts:/app/scripts  \
 kuoxu_centos:0.0.1 

容器启动后,可以通过docker container ls 查看启动状态。如果没有对应的数据,则表明容器启动失败或容器启动执行完后自动停止了(守护线程)。
可以通过以下命令查看日志,如果没有错误日志,则可能是容器启动完后自动停止了。

docker logs -f -t --tail=100 kuoxu_centos1

有错误日志,则根据提示解决问题(修正run参数、调整启动脚本、dockerfile等)。
问题如果发生在dockerfile脚本里,必须要重新build。

2.6 进入容器

# 以bash交互的方式进入的容器,这个容器可以使用容器id或名称
docker exec -it kuoxu_centos1 bash
#进入后,命令的界面就已经不一样了,类似于以下这个
#[root@d01b40d8abd4 scripts]
#进入后退出命令
exit

后记

到这里,docker的环境搭建和dockerfile的编写已经基本完成了,如有问题,欢迎留言。

你可能感兴趣的:(docker)