jk's notes
  • 第二部分 实战案例

第二部分 实战案例

这一部分几乎都是安装容器的案例.

第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

image-20231101093314416

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 服务的镜像. 并介绍两种创建容器的方法:

  1. 基于 docker commit
  2. 基于 Dockerfile

使用 Dockerfile 可以脚本化, 版本化. 推荐使用.

10.1 基于 commit 命令创建

该命令基于容器创建镜像, 常用语法为

$ docker commit <容器名> 新镜像名:tag

书中演示基于 ubuntu:18.04 来添加 SSH, 然后创建镜像.

基本步骤:

  1. 拉取并运行 ubuntu:18.04
  2. 配置源, 更新源
  3. 安装 ssh 服务, 并配置
  4. 保存镜像
  5. 使用镜像

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

添加源步骤

  1. 在 /etc/apt/sources.list.d/ 目录下创建 xxx.list 文件
  2. 在其中添加源
  3. 执行 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

image-20231101105641854

10.1.5 使用镜像

docker run -p 10022:22 -d my-sshd-mage:ubuntu /run.sh

然后登录, 注意使用 root 账户

ssh root@localhost -p 10022

image-20231101110635282

10.2 使用 Dockerfile

基本步骤:

  1. 创建工作目录, 所有的操作与存放资源文件等均在该目录下进行
  2. 编写 run.sh 脚本, 准备 authorized_keys 文件
  3. 编写 Dockerfile
  4. 创建镜像
  5. 测试镜像, 运行容器

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 .

注意最后的点

image-20231101115013084

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.
  • 官方给出了详细用法说明.

简单用法分两种:

  1. 构建自己的镜像, 将需要的静态文件构建进去
  2. 使用卷映射, 直接运行 apache 容器

1. 构建镜像

步骤:

  1. 创建本地目录, 作为环境目录.
  2. 创建 html 文件夹, 放置需要部署的 html 文件.
  3. 创建 Dockerfile, 编辑 Dockerfile.
  4. 构建镜像, 运行容器
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"]
Last Updated:
Contributors: jk