首页 docker使用简明教程
文章
取消

docker使用简明教程

关于docker安装,查看,镜像管理,以及一个实用Dockerfile, LAMP,PHP,LTMJ。

  • 关于本blog,图床一般使用github,已经配置了CDN,如果图片还是未显示请自行代理解决

一、Docker安装

  • 在Ubuntu系统下安装:
1
apt-get install docker
  • 在Fedora/CentOS系统下安装:
1
2
yum install docker
dnf install docker # Fedora 25+
  • 在SUSE系统下安装:
1
zypper install docker

二、Docker容器

  • 首先启动Docker
1
2
3
4
# 启动Docker
systemctl start docker
# 设置开机自启动,可选
systemctl enable docker
  • 启动Docker测试容器
1
docker run "hello-world"
  • 在启动容器时,如果使用的镜像在本地不存在,会尝试从网络上获取。
  • 在一般情况下,启动Web服务的容器,使用以下命令:
1
2
3
# -d:daemon,使容器在后台运行
# -p:port,指定容器的端口,这里是将容器的80端口映射到主机的8001端口
docker run -d -p 8001:80 "image_name"
  • 查看容器运行情况
1
docker ps
  • Docker会为容器分配一个Container ID和一个Container Name,Name可以在运行时通过-name自行指定,这两个可以用来标识容器。
  • 需要停止容器时,使用以下命令:
1
2
3
4
5
docker stop "container_name"
# 或使用ID查找
docker stop "container_id"
# 重启
docker restart "container_id"

三、Docker镜像

Dokerfile编译镜像

  • Docker容器是运行的Docker镜像实例,一般情况下,我们需要制作自己的Docker镜像。
  • Docker镜像的制作依赖于Dockerfile,我们稍后在讨论Dockerfile的编写,这里假定我们有一个编写好的Dockerfile。
  • 下面的命令将在当前路径查找Dockerfile并构建一个名为“image_name”的镜像。
1
docker build -t "image_name" ./

查看本地所有镜像

  • 在构建过程中需要在网络上下载来源镜像,可能需要一段时间。
  • 如果Dockerfile中的命令都正确结束(Exit code 0),那么Docker镜像的构建也将顺利完成,我们可以通过下面的命令查看我们的所有镜像:
1
docker images

导出备份已有镜像文件

  • 我们还可以导出我们制作好的Docker镜像,下面的命令将image_name镜像导出为image_name.tar
1
docker save "image_name" > image_name.tar

导入已有镜像备份

  • 在另一台机器上,我们不需要网络就可以导入并使用该镜像:
1
docker load < image_name.tar

四、Dockerfile

  • Dockerfile本质上是一组命令集合,用于自动化构建镜像,下面以几个实例来说明Dockerfile的编写方法:

实例一:LAMP(Linux+Apache+MySQL+PHP)环境配置

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
# 来源镜像,一般可以使用标准的系统或者带有各种环境的系统
# 显然这里使用的是标准的Ubuntu 14.04系统
FROM ubuntu:14.04
# 镜像作者
MAINTAINER wrlu
# 刷新日期
ENV REFRESHED_AT 2018-08-05
# 设定字符集
ENV LANG C.UTF-8
# RUN命令用于执行系统命令
# 因为需要自动化安装,所以最好通过-y命令跳过确认
# 更新APT软件源
RUN apt-get update -y
# 安装MySQL
RUN apt-get -y install mysql-server
# 安装Apache
RUN apt-get -y install apache2
# 安装PHP5
RUN apt-get -y install php5 libapache2-mod-php5
RUN apt-get install -yqq php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
# 删除Apache2列出目录配置
RUN sed -i 's/Options Indexes FollowSymLinks/Options None/' /etc/apache2/apache2.conf
# COPY命令可以复制文件,但是似乎不能递归复制文件
COPY IncludeAirline/* /var/www/html/
COPY IncludeAirline/airlines/* /var/www/html/airlines/
# 删除默认的主页
RUN rm /var/www/html/index.html
# 复制启动脚本
COPY start.sh /root/start.sh
RUN chmod +x /root/start.sh
# 设置启动目录以及启动脚本
ENTRYPOINT cd /root; ./start.sh
# 设置需要暴露的端口
EXPOSE 80,3306 
  • 本例中还有一个启动脚本start.sh,用于导入数据库,编写如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# 启动后延时
sleep 1
# 启动Apache服务器
/etc/init.d/apache2 start
# 启动MySQL数据库
find /var/lib/mysql -type f -exec touch {} ; && service mysql start
# 定义SQL文件路径
sqlfile=/var/www/html/includeAirline.sql
if [ -f $flagfile ]; then
	# 修改MySQL的密码
    mysqladmin -u root password "root"
    # 登录MySQL并导入SQL文件执行
    mysql -uroot -proot < $sqlfile
    # 删除SQL文件
    rm -f $sqlfile
fi
# 此处注意,如果命令执行完后脚本退出
# 则Docker容器也会因为没有前台应用运行而中止
# 所以这里使用一个前台命令来保活Docker容器
tail -f /var/log/apache2/error.log

实例二:PHP环境配置:

1
2
3
4
5
6
7
8
# 来源镜像,自带Apache+PHP环境
FROM php:7.0-apache
MAINTAINER tl
ENV REFRESHED_AT 2018‐08‐03
ENV LANG C.UTF‐8
# ADD命令在COPY命令的基础上,具有自动解包tar的功能
ADD web_tired.tar /var/www/html/
EXPOSE 80

实例三:LTMJ(Linux+Tomcat+MySQL+JSP)环境配置

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
FROM ubuntu:16.04
MAINTAINER wrlu
ENV REFRESHED_AT 2018-08-05
ENV LANG C.UTF-8
RUN apt-get update -y
RUN apt-get -y install mysql-server
# 安装wget,因为Docker提供的镜像是最小镜像,所以用到的其他工具需要自行安装
RUN apt-get -y install wget
# 安装Java 8
RUN apt-get -y install openjdk-8-jre
# 下载Tomcat 8服务器
RUN wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz
# 解压tar.gz
RUN tar -xzf apache-tomcat-8.5.32.tar.gz -C /root
RUN mv /root/apache-tomcat-8.5.32 /root/tomcat
# 删除默认页面
RUN rm -rf /root/tomcat/webapps/*
# 拷贝war文件
COPY CAAC-SQL-Injection.war /root/tomcat/webapps/
COPY wafwtf.sql /root/
COPY start.sh /root/start.sh
RUN chmod +x /root/start.sh
ENTRYPOINT cd /root; ./start.sh
# Tomcat使用8080端口,不同于Apache
EXPOSE 8080
  • 启动脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
sleep 1
find /var/lib/mysql -type f -exec touch {} ; && service mysql start
chmod +x /root/tomcat/bin/startup.sh
# 启动Tomcat服务器
/root/tomcat/bin/startup.sh
sqlfile=/root/wafwtf.sql
if [ -f $flagfile ]; then
    mysqladmin -u root password "root"
    mysql -uroot -proot < $sqlfile
    rm -f $sqlfile
fi
# 容器保活
tail -f /root/tomcat/conf/server.xml
本文由作者按照 CC BY 4.0 进行授权

宝塔linux面板重启、重置等命令整合

Gitlab的安装及使用教程完全版