Docker实例笔记

背景

Docker的命令很多,但是如果直接记忆,其实并不利于长期使用,还是要配合着实际案例,尤其是那个Dockerfile自制镜像,原本的方案就是看完基础就撤,但是无奈没看懂那个自制镜像,所以只能继续下去,配合文中实际案例看能否理解

内容

所有的镜像文件运行都得有个平台在那,在docker中,基本有如下几种:busybox、apline、debian、ubuntu、fedora、centos,基本创建应用的时候就选择其中一个做平台(就那个dockerfile中的From

1
2
# 可以自己搜索一下
docker search --filter star=50 [镜像名]

默认情况下所有的容器只能通过exec方式进入内容,有点不方便,所以我们可以考虑给容器加个ssh,这样就阔以远程了.

创建这样的镜像有两种方案:基于容器的创建、使用dockerfile创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 进入运行的ubuntu容器中
apt-get update
apt-get install openssh-server

# 编辑容器启动时,启动ssh服务的命令文件,该命令文件最好位于容器根目录下,方便调用,命令文件内容如下:
#!/bin/bash
/usr/sbin/sshd -D # -D参数是为了保持该命令窗口一直运行,否则容器会直接停掉

# 将宿主机的公钥复制到容器中,也可以直接将内容复制过去,不过.ssh文件夹要提前创建好
docker cp ~/id_rsa.pub [容器名]:/home/.ssh/authorized_keys

# 然后基于该容器创建镜像文件
docker commit [容器ID] [新镜像:版本]

# 基于新镜像创建容器,run.sh就是sshd服务启动的命令文件
docker run -d -p [本地端口:容器端口] [新镜像:版本] /run.sh

# 然后就可以ssh了

上述方式是通过container创建,那么如果使用dockerfile呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建一个工作目录,并在工作目录中准备好要用的文件run.sh和authorized_keys
mkdir ubuntu_work

# 创建Dockerfile文件,内容如下;
#设置继承镜像
FROM ubuntu:18.04
#提供一些作者的信息
MAINTAINER docker_user (user@docker.com)
#安装 ssh 服务
RUN apt-get install -y openssh-server
# 创建sshd文件夹很重要,因为没他,sshd服务启动不起来
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#开放端口
EXPOSE 22
#设置自启动命令
CMD ["/run.sh"]

# 执行命令,后面的.表示ubuntu的工作目录
docker build -t wudashuai:1.0 .

基于官方已拥有的镜像进行创建的话,就利用docker 容器,这点类似于将原有的服务整个打个压缩包复制到新的服务器上解压,并没有什么特别之处,所以接下来的几个案例就跳过这个,直记录Dockerfile创建的方式:

针对apache的dockerfile创建,如下:

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
35
36
37
38
# 使用ubuntu镜像
FROM ubuntu:latest
MAINTAINER docker_user
# 配置环境变量,所有的操作都是非交互式的,该变量的noninteractive表示不接受用户的输入,直接使用命令
ENV DEBIAN_FRONTEND noninteractive
# 修改apache的本地时间
RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata

RUN apt-get update && apt-get upgrade -y
RUN apt-get install apache2 -y && rm -rf /var/lib/apt/lists/*
ADD run.sh /run.sh
ADD apache2.conf /etc/apache2/

# 设置apache2的服务监听端口,新增用ADD,而覆盖用COPY
COPY ports.conf /etc/apache2/
RUN chmod +x run.sh
RUN mkdir -p /var/lock/apache2

# 下面有一个APACHE_RUN_DIR,需要创建这个路径
RUN mkdir -p /var/run/apache2
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www

# 开放端口,对应apache监听的端口
EXPOSE 8001
EXPOSE 8002

# WORKDIR可以切换命令执行的目录,最后的WORKDIR可以设置docker登录时的默认路径
WORKDIR /root
CMD ["/run.sh"]

创建容器的时候可以使用-v参数将apache的网站运行目录映射到本地

针对Nginx的Dockerfile创建如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM ubuntu:latest
LABEL Author=wudashuai
RUN apt-get update
RUN apt-get install nginx -y
# 删除它是为了清理安装时产生的下载缓存内容
RUN rm -rf /var/lib/apt/lists/*
RUN echo "Asian/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
ADD run.sh /run.sh
RUN chmod +x /run.sh
# 这个表示在nginx容器中将这些路径给挂载到宿主机中,这些文件夹由docker自己创建,可以通过docker inspect查看
VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/certs","etc/nginx/conf.d","var/log/nginx"]
COPY default /etc/nginx/sites-available/
WORKDIR /etc/nginx
EXPOSE 7000
CMD ["/run.sh"]

创建容器的时候可以使用-v参数将nginx的网站运行目录映射到本地

说了上面这些,你有没有好奇,docker主进程和容器的进程之间到底有啥关系?这就要讲到一个命令pstree

1
2
# pstree可以将主进程与其他的进程以树状方式展现出来
pstree -l -a -A [主进程ID]