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]
|