Docker 入门实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V_Junk/article/details/82726654

这篇文章,算是这个主页搭建起来的第一篇文章,内容比较简单但不乏有参考其他文章的,先谢过,各路大侠。本文基于 Centos7 的入门实战,详情请参看官方文档。从简单的从构建第一个镜像开始,到发布 web 应用,会创建 mysql 数据容器 和 tomcat 容器。首发于 https://yanghj7425.github.io/

安装 Docker

目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。

CentOS 安装 Dodker CE

参考菜鸟教程或者官网

安装一些必要的系统工具:

yum install -y yum-utils device-mapper-persistent-data lvm2

添加软件源信息:

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新 yum 缓存:

yum makecache fast

安装 Docker-ce:

yum -y install docker-ce

启动 Docker 服务:

service docker start #或 systemctl start docker

镜像加速

新版的 Docker 使用 /etc/docker/daemon.json(Linux),如果没有这个文件就创建一个(我本机是没有的)。

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

删除 Docker CE

执行以下命令来删除 Docker CE:

yum remove docker-ce

rm -rf /var/lib/docker
rm -rf /var/run/docker
rm -rf /etc/docker

Hello World

可以在 Docker 容器内运行程序,通过使用 docker run 命令在容器内运行一个应用程序。运行程序首先要先获得镜像,获取镜像文件可以通过从仓库 pull, 也可通过 Dockerfile 自行构建。如果执行 docker run 时容器内没有可用的镜像就会尝试从官方获取。

通过从官方拉去镜像

docker run hello-world

通过 Dockerfile 构建

可以通过命令 docker build -t 镜像名称 Dockerfile文件路径 来自动构建镜像。
输入内容(这段 Demo 可以按照官网提供的来,这里自己觉得方便就好)

  • 创建 Dockerfile 文件

        #
        # MAINTAINER        H.J.Yang <[email protected]>
        # DOCKER-VERSION    18.06.1-ce, build e68fc7a
        #
        # Dockerizing hello/docker: Dockerfile for building hello/docker images
        #
        FROM       centos:centos7.1.1503
    
        ENTRYPOINT ["/bin/echo","hello_docker"]                                                    
  • build 一个镜像

    docker  build -t hello/docker:0.1  .
  • 查看可用的镜像

    docker images #或 docker image ls
    • 目前结果如下:
          [root@centos3 hello_world]# docker image ls
          REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
          hello/docker        0.1                 0838b223b2f7        9 minutes ago       212MB
          centos              centos7.1.1503      b96d683c39b0        5 weeks ago         212MB
  • 运行容器
    使用 docker run hello/docker:0.1 命令运行后会随机生成一个容器名称,也可通过 --name 参数指定:docker run --name hello hello/docker:0.1, 指定生成的容器名为 hello。

创建 Tomcat 容器

Java web 要跑起来,就需要一些系统资源和环境变量。容器一旦运行,就不建议手动修改容器内部的配置,若必须进入容器修改那修改后就需要使用 docker commit containerid imagename 来把修改过的容器提交到一个镜像文件。

创建 Centos7 镜像

这里就简单的依赖 centos7.1.1503 来创建 Centos7 的基础镜像。先创建一个 Centos7 的基础镜像,主要是安装一些必要工具软件和对容器做一些必要的设置,后面的镜像都依赖这个基础镜像创建。如:下面 Dockerfile 文件中设置了签名和 root 用户的密码后才可用 通过 ssh 连接上运行的镜像容器。

  • Dockerfile
#
# MAINTAINER        H.J.Yang <[email protected]>
# DOCKER-VERSION    18.06.1-ce, build e68fc7a
#
# Dockerizing centos7 : Dockerfile for building centos7 images
#

FROM       centos:centos7.1.1503
MAINTAINER H.J.Yang<[email protected]>

ENV TZ "Asia/Shanghai"
ENV TERM xterm


RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \
    yum install -y gcc gcc-c++ git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && \
    yum install -y openssh-server && \
    yum clean all

#生成签名
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

#设置root用户密码
RUN "/bin/echo" root | passwd --stdin root

#删除缓存
RUN  rm -rf /var/cache/yum

#暴露 22 端口
EXPOSE 22

CMD ["/bin/echo", "centos7 started"]
  • 创建镜像
    docker build -t base/centos7:0.1 .

  • 运行容器
    docker run -d -p 7777:22 --name centos7 base/centos7:0.1 /usr/sbin/sshd -D

    • 参数:
      -d 表示在后台运行一个容器
      -p 表示把宿主机的 7777 端口和容器的 22 端口做映射
      -D 这个是 sshd 的表示以守护进程的方式启动
  • 连接测试
    ssh root@localhost -p 7777,这是在宿主机上访问。若想在非宿主机上访问则需要打开防火墙,命令如下:

        firewall-cmd --zone=public --add-port=7777/tcp

创建 Tomcat 镜像

创建前需要去下载 tomcat 和 jdk 这两必要的系统环境,注意下载 liunx 版本的,win 的我没试过能不能在 liunx 下跑。但是 Java native 方法这些我估计是不行。新建一个 tomcat 目录把下载好的 jdk 和 tomcat 都放到 tomcat 目录下。
- Dockerfile

#
# MAINTAINER        H.J.Yang <[email protected]>
# DOCKER-VERSION    18.06.1-ce, build e68fc7a
#
# Dockerizing tomcat8/centos7: Dockerfile for building hello/docker images
#

FROM base/centos7:0.1
MAINTAINER H.J.Yang <[email protected]>

# 把宿主机的拷贝到容器的指定目录下,COPY 也有可用拷贝,但是 ADD 有解压功能
ADD jdk-8u181-linux-x64.tar.gz   /usr/local/
ADD apache-tomcat-8.0.53.tar.gz  /usr/local/

# 改变目录名称
RUN mv /usr/local/apache-tomcat-8.0.53 /usr/local/tomcat8

# 设置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
ENV CATALINA_HOME /usr/local/tomcat8
ENV CATALINA_BASE /usr/local/tomcat8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin 

EXPOSE 8080

# 启动容器时启动 tomcat
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]
  • 创建镜像
    docker build -t tomcat8/centos7:0.1 .

  • 运行容器
    docker run -d -p 9000:8080 --name tomcat8 tomcat8/centos7:0.1

  • 测试容器
    wget localhost:9000 这个命令会抓取到一个 index.html 文件。如果想要在非宿主机的浏览器访问需要打开防火墙,命令如下:

        firewall-cmd --zone=public --add-port=9000/tcp

创建 Mysql 容器

获取一个 MySQL 容器可以通过命令在之前创建的基础系统上安装 mysql 实现,也可以通过 pull 拉取现有的 mysql镜像。

使用 pull 拉去官方镜像

命令: docker pull mysql:5.7.17

运行 mysql容器

命令:docker run -d -p 5555:3306 --name mysql5.7 -v /var/lib/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.17,执行后打开防火墙外部设备就通过宿主机 5555 端口访问到数据库容器。若其他容器数据库容器则需要通过数据库容器本身的IP地址和 3306 端口访问。
- 参数:
-v:表示通过挂载卷的方式运行,可通过:docker inspect <containerID> 查看容器内部的信息。
-e: 表示环境变量和 Dockerfile 中 EVN 意思一样。
-p:表示把宿主机 5555 端口映射到容器的 3306 端口。

发布 Web 应用

发布到 Tomcat 容器内部的 web 应用访问数据库不能通过宿主机的 IP 及端口访问,要通过数据容器的自己的 IP 地址和端口。

  • 查看数据容器的 IP,命令:
[root@centos3 mysql]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql5.7
172.17.0.2
[root@centos3 mysql]#

得到 IP 地址就可以在 web 应用的 JDBC 中配置。

  • 发布 Web 项目
    这里通过 -v 参数把 war 包挂载到 tomcat 容器内运行。此处就把 war 包放到宿主机的 tomcat 目录中。
    命令:
docker run -d -p 9000:8080 -v /docker/tomcat/SimpleDemo.war:/usr/local/tomcat8/webapps/SimpleDemo.war --name tomcat8 tomcat8/centos7:0.1

打包时jdbc 配置如下:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://172.17.0.2:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
jdbc.username=root
jdbc.password=123456

最后打开防火墙的 9999 端口就可以在非宿主机上通过浏览器范围了,如果不能达到预先的效果,可以通过 docker logs -f containerName 查看容器日志。

猜你喜欢

转载自blog.csdn.net/V_Junk/article/details/82726654
今日推荐