第二部分 实战案例
这一部分几乎都是安装容器的案例.
第09章 操作系统
主要介绍一些常用的小OS, 可以作为自定义镜像的基础镜像.
9.1 Busybox
很小, 大约 2M 左右, 集成了一百多个命令. 被誉为 Linux 系统的瑞士军刀.
但是对于安装软件啥的, 没有
yum
,apt-get
等这类工具. 需要自行配置. 经测试也没有安装gcc
,cc
等工具.
拉取镜像: docker pull busybox:latest
启动镜像: docker run -it busybox
可以带上
--rm
在退出时删除容器.
相关资源:
- 官网: https://busybox.net/
9.2 Alpine
作为基础镜像 比 busybox 好. 具备很多可用软件
面向安全的轻型 Linux 发行版. 基于 musl, libc, BusyBox, 具备了 apk 查询和安装软件包. 大约 5M 左右.
docker run apline echo 'hello' # 直接运行, 自动下载镜像
time docker run apline echo 'hello' # 可以检查启动时间
安装软件包可以使用
apk add --no-cache <package>
apline 软件包的名字与其他发行版不同, 可以在 https://pkgs.alpinelinux.org/packages 来搜索.
如果没有必要软件包, 可以使用社区索引, 首先更新源再安装
echo "http://dl-4.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories apk --update add --no-cache <package>
相关资源:
- 官网: http://alpinelinux.org
作为基础镜像这个不错
示例, 在 alpine 上安装 dotnet7
apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib # 安装基础依赖
wget https://download.visualstudio.microsoft.com/download/pr/4132d5d3-6bbd-4015-a5f6-41ce2abac598/91a06d4d270919a86eeefd88b56d529f/dotnet-sdk-7.0.403-linux-musl-x64.tar.gz
mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-7.0.403-linux-musl-x64.tar.gz -C $HOME/dotnet
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
然后运行测试:
dotnet --info
9.3 Debian/Ubuntu
相对较大, 功能更完整. 最主要的是具备完整的社区软件包可以使用.
在使用之前需要
apt-get update
一下.可用于学习, 或作为基础镜像来使用.
相关资源
- Debian 官网: https://debian.org
- Ubuntu 官网: https://ubuntu.com/
9.4 CentOS/Fedora
角色与 Debian/Ubuntu 一样.
- Fedora 官网: https://getfedora.org
- CentOS 官网: https://www.centos.org/
第10章 为镜像添加 SSH 服务
本章创建带有 SSH 服务的镜像. 并介绍两种创建容器的方法:
- 基于
docker commit
- 基于 Dockerfile
使用 Dockerfile 可以脚本化, 版本化. 推荐使用.
10.1 基于 commit 命令创建
该命令基于容器创建镜像, 常用语法为
$ docker commit <容器名> 新镜像名:tag
书中演示基于 ubuntu:18.04 来添加 SSH, 然后创建镜像.
基本步骤:
- 拉取并运行 ubuntu:18.04
- 配置源, 更新源
- 安装 ssh 服务, 并配置
- 保存镜像
- 使用镜像
10.1.1 拉取并运行 ubuntu:18.04
docker run -it ubuntu:18.04 bash
10.1.2 配置源, 更新源
更新源 apt-get update
也可以使用其他源:
- 网易源: https://mirrors.163.com/.help/ubuntu.html
- 阿里源: https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.1c501b11v7gd19
添加源步骤
- 在
/etc/apt/sources.list.d/
目录下创建xxx.list
文件 - 在其中添加源
- 执行
apt-get update
vim /etc/apt/sources.list.d/163.list
apt-get update
还是需要先
update
,vim
需要单独安装
也可以考虑 docker cp
命令, 例如在当前目录下创建 163.list
文件
docker cp ./163.list <容器ID>:/etc/apt/sources.list.d/
即可将该文件拷贝进容器.
也可以直接覆盖 /etc/apt/sources.list
文件(做好备份).
10.1.3 安装 ssh 服务并配置
apt-get install openssh-server -y
伴随会安装很多依赖. 然后创建必要的目录, 并启动服务.
mkdir -p /var/run/sshd
/usr/sbin/sshd -D &
检查 22 端口
netstat -tunlp
修改 SSH 服务登录的安全配置, 取消 pam 登录限制 (是不是没有密码???)
sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
前面4个空格, 后面5个空格
在 root
目录下创建 .ssh
目录, 将公钥信息存入 authorized_keys
文件中.
创建自动启动的 run.sh 文件, 并设置权限:
vim /run.sh
chmod +x /run.sh
脚本内容为:
#!/bin/bash
/usr/sbin/sshd -D
然后退出容器.
10.1.4 保存镜像
首先记录容器的 id, 可以使用 docker ps -a
查看. 然后执行
docker commit 镜像id 新容器名:tag
来创建镜像
docker commit 2fd6 my-sshd-mage:ubuntu
10.1.5 使用镜像
docker run -p 10022:22 -d my-sshd-mage:ubuntu /run.sh
然后登录, 注意使用 root 账户
ssh root@localhost -p 10022
10.2 使用 Dockerfile
基本步骤:
- 创建工作目录, 所有的操作与存放资源文件等均在该目录下进行
- 编写
run.sh
脚本, 准备authorized_keys
文件 - 编写 Dockerfile
- 创建镜像
- 测试镜像, 运行容器
10.2.1 创建工作目录
mkdir sshd_ubuntu
cd sshd_ubuntu
touch Dockerfile run.sh
10.2.2 创建 run.sh
和 authorized_keys
run.sh
文件内容与上一节一样. authorized_keys
实际上就是 id_rsa.pub
的内容
#!/bin/bash
/usr/sbin/sshd -D
-D
是后台运行的含义
cat ~/.ssh/id_rsa.pub > authorized_keys
10.2.3 编写 Dockerfile
# 继承自 ubuntu:18.04
FROM ubuntu:18.04
# 作者信息
MAINTAINER docker_user (user@docker.com)
# 执行命令
RUN echo "deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN apt-get update
# 安装 sshd
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
# 取消 PEM 限制
RUN sed -ri 's/session required pem_loginuid.so/# session required pem_loginuid.so/g' /etc/pam.d/sshd
# 复制资源
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 775 /run.sh
# 开放端口
EXPOSE 22
# 设置自启动
CMD ["/run.sh"]
注意更换源的第一个是
>
, 即覆盖原有源.
10.2.4 创建镜像
docker build -t sshd:dockerfile .
注意最后的点
10.2.5 测试镜像, 运行容器
此时运行镜像, 就不用带有 /run.sh
参数了.
再次连接时, 需要删除
.ssh
目录下的known_hosts
文件中对应域名的记录.
第11章 Web 服务与应用
介绍使用 Docker 来运行一些成见的服务器软件. 例如 Apache, Nginx, Tomcat 等. 也会介绍一些复杂的项目, 例如 CICD 等.
依旧交替使用两种方法来创建镜像 (Dockerfile 或 commit 命令)
11.1 Apache
11.1.1 使用 DockerHub 镜像
- 官方提供的是一个纯 Apache 镜像, 仅作为静态网页部署用.
- 如果需要使用 PHP, 则搜素 PHP 镜像.
- apache 的地址为: https://hub.docker.com/_/httpd.
- 官方给出了详细用法说明.
简单用法分两种:
- 构建自己的镜像, 将需要的静态文件构建进去
- 使用卷映射, 直接运行 apache 容器
1. 构建镜像
步骤:
- 创建本地目录, 作为环境目录.
- 创建 html 文件夹, 放置需要部署的 html 文件.
- 创建 Dockerfile, 编辑 Dockerfile.
- 构建镜像, 运行容器
FROM httpd:2.4
COPY ./html /usr/local/apache2/htdocs/
然后构建镜像, 运行容器
docker build -t my-apache2 .
docker run -dit --name my-running-app -p 8080:80 my-apache2
apache 容器在运行起来时, 会自动启动 httpd 服务
直接使用镜像的方式为:
docker run -it --rm --name my-apache-app -p 80:80 -v <本地路径>:/usr/local/apache2/htdocs/ httpd:2.4
2. 使用自定义镜像
所谓自定义镜像就是使用一个 Linux 发行版, 自己来安装 apache, 然后将其做成镜像. 下面给出步骤:
$ mkdir apache_ubuntu && cd apache_ubuntu
$ touch Dockerfile run.sh
$ mkdir html && cd html && echo 'Hello World From Docker Apache' > index.html
编写 run.sh
文件.
#!/bin/bash
exec apache2 -D FOREGROUND
编写 Dockerfile
FROM ubuntu:18.04
LABEL name="jk"
LABEL email="jk@jklib.org"
# 避免在安装依赖时提示用户交互
ENV DEBIAN_FRONTEND noninteractive
COPY sources.list.bionic /etc/apt/sources.list
RUN apt-get update -y
RUN apt-get -yq install tzdata
RUN apt-get -yq install apache2 && \
rm -rf /var/lib/apt/lists/*
RUN echo "Asia/Shanghai" > /etc/timezone && \
dpkg-reconfigure -f noninteracive tzdata
ADD run.sh /run.sh
RUN chmod 755 /*.sh
RUN mkdir -p /var/lock/apache2 && \
mkdir -p /var/run/apache2 && \
mkdir -p /app && \
rm -fr /var/www/html && \
ln -s /app /var/www/html
COPY html/ /app
# 设置一些环境变量, 运行容器时, 可以使用 -e 替代
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 dock.localhost
ENV APACHE_DOCUMENTROOT /var/www
EXPOSE 80
WORKDIR /app
CMD ["/run.sh"]