Linux下Docker的使用

一、Docker安装

  • Docker是目前最常用的自动化容器系统,可以实现自动化环境部署、迁移等功能,本文叙述了Docker的基本使用方法。
  • 在Ubuntu系统下安装:
apt-get install docker.io
  • 在Fedora/CentOS系统下安装:
yum install docker
dnf install docker # Fedora 25+
  • 在SUSE系统下安装:
zypper install docker

二、Docker容器

  • 首先启动Docker
# 启动Docker
systemctl start docker
# 设置开机自启动,可选
systemctl enable docker
  • 启动Docker测试容器
docker run "hello-world"
  • 在启动容器时,如果使用的镜像在本地不存在,会尝试从网络上获取。
  • 在一般情况下,启动Web服务的容器,使用以下命令:
# -d:daemon,使容器在后台运行
# -p:port,指定容器的端口,这里是将容器的80端口映射到主机的8001端口
docker run -d -p 8001:80 "image_name"
# -p参数可以多次使用,也可以指定一个端口范围
docker run -d -p 8080-8083:8080-8083 -p 80:80 -p 443:443 "image_name"
  • 查看容器运行情况
docker ps
# 也查看已经停止的容器
docker ps -a
  • Docker会为容器分配一个Container ID和一个Container Name,Name可以在运行时通过-name自行指定,这两个可以用来标识容器。
  • 需要停止容器时,使用以下命令:
docker stop "container_name"
# 或使用ID查找,仅输入ID的前几位即可
docker stop "container_id"
  • 删除容器
docker rm "container_name"
docker rm "container_id"
# 删除所有容器
# docker rm $(docker ps -a)
  • 在容器运行的时候,可以用exec命令进入容器的Shell中进行一些操作
docker exec -it "container_id" /bin/bash

三、Docker镜像

  • Docker容器是运行的Docker镜像实例,一般情况下,我们需要制作自己的Docker镜像。
  • Docker镜像的制作依赖于Dockerfile,我们稍后在讨论Dockerfile的编写,这里假定我们有一个编写好的Dockerfile。
  • 下面的命令将在当前路径查找Dockerfile并构建一个名为“image_name”的镜像。
docker build -t "image_name" .
  • 在构建过程中需要在网络上下载来源镜像,可能需要一段时间。
  • 如果Dockerfile中的命令都正确结束(Exit code 0),那么Docker镜像的构建也将顺利完成,我们可以通过下面的命令查看我们的所有镜像:
docker images
  • 在镜像构建过程中会生成一些中间镜像,可使用-a参数查看
docker images -a
  • 删除不需要的镜像,注意镜像之间是有依赖关系的
docker rmi "image_id"
  • 我们还可以导出我们制作好的Docker镜像,下面的命令将image_name镜像导出为image_name.tar
docker save "image_name" > image_name.tar
  • 在另一台机器上,我们不需要网络就可以导入并使用该镜像,当然两台机器必须是相同的体系结构(同为x86或ARM):
docker load < image_name.tar

四、Dockerfile

  • Dockerfile本质上是一组命令集合,用于自动化构建镜像
  • 来源镜像,一般可以使用标准的系统或者带有各种环境的系统
FROM ubuntu:latest
  • 可以指定镜像的作者、日期、字符集等等
MAINTAINER wrlu
ENV REFRESHED_AT 2019-06-05
ENV LANG C.UTF-8
  • 对于Debian的镜像可以设置禁止交互,这样制作镜像的时候就不会卡住
ENV DEBIAN_FRONTEND=noninteractive
  • PHP7配置实例
RUN apt-get -y install php7.2 libapache2-mod-php7.2
RUN apt-get -y install php7.2-mysql php7.2-curl php7.2-gd php7.2-intl php7.2-imagick php7.2-imap php7.2-memcache php7.2-ps php7.2-pspell php7.2-recode php7.2-snmp php7.2-tidy php7.2-xmlrpc php7.2-xsl
  • 一般情况下,为了使某些服务以低权限运行,可以创建新的用户
RUN useradd test
RUN mkdir /home/test/
RUN chown -R test:test /var/www/html/example
  • Java 11以及Tomcat 9配置实例
RUN apt-get -y install openjdk-11-jre
COPY tomcat/apache-tomcat-9.0.20.tar.gz /home/test/
RUN tar -xzf /home/test/apache-tomcat-9.0.20.tar.gz -C /home/test/
RUN mv /home/test/apache-tomcat-9.0.20/ /home/test/tomcat/
RUN rm /home/test/apache-tomcat-9.0.20.tar.gz
RUN rm -rf /home/test/tomcat/webapps/*
COPY source/SecIoT.war /home/test/tomcat/webapps/
  • 启动脚本配置
COPY startup.sh /root/startup.sh
ENTRYPOINT bash /root/startup.sh
  • 端口暴露配置
EXPOSE 80,443
EXPOSE 8080-8083
EXPOSE 9000-9999
  • 启动脚本,完成Apache,MySQL,Tomcat等启动
#!/bin/bash
sleep 1
/etc/init.d/apache2 start
service mysql start
# 阻塞命令,用于阻止容器退出
tail -f /var/log/apache2/error.log
bash /home/test/tomcat/bin/startup.sh
sleep 10
tail -f /home/test/tomcat/logs/catalina.out
  • MySQL配置,新版本不能再使用mysqladmin配置口令了,需要借助sql文件进行
RUN apt-get -y install mysql-server
COPY test.sql /root/test.sql
COPY change_password.sql /root/change_password.sql
#!/bin/bash
service mysql start
mysql -uroot < /root/wp.sql
rm /root/wp.sql
mysql -uroot < /root/change_password.sql
rm /root/change_password.sql
use mysql;
update user set authentication_string=PASSWORD("YOUR_MYSQL_PASSWORD") where User='root';
update user set plugin="mysql_native_password";
flush privileges;
  • 在启动脚本中设置环境变量
export PATH=$PATH:/home/test/apps/jadx/bin/