15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 一文搞懂 AWS Docker 基础 下篇 实战

一文搞懂 AWS Docker 基础 下篇 实战

时间:2023-07-27 18:36:02 | 来源:网站运营

时间:2023-07-27 18:36:02 来源:网站运营

一文搞懂 AWS Docker 基础 下篇 实战:本文承接《一文搞懂 AWS Docker 基础 上篇 理论》,实战测试运行 docker。

读完也许就会发现使用 docker 也没那么难。

Win10 下 WSL2 和 Docker Desktop 的详细配置请参考《AWS CDK 利用 asset 编译 Docker 镜像并部署到 ECS Fargate (Python)》一文。

目录

  1. 运行一个 httpd 网站
2. 容器与本地文件交换

3. 编译镜像

4. 运行容器作为 mysql 客户端

环境(配置)

实战步骤

1. 运行一个 httpd 网站

传统上,如果我们要在本机上运行一个测试网站(httpd),先需要下载 httpd 软件,然后双击安装进行配置。

有了 WSL2 之后,我们可以直接用 httpd 镜像,在本机上运行一个 docker 网站,十分方便。(没有 WSL2 之前也可以用 Docker desktop 运行容器,但是只能用 powershell 或者 CMD 与 docker 互交)

登录 Docker 仓库

第一次使用 docker 时,需要先登录 docker 公共仓库才能 pull 镜像。帐号可以在 docker 官网免费注册。https://www.docker.com/

用如下命令登录

docker login图 1




pull httpd 镜像

生成网站容器前,我们先从 docker 公共仓库 pull httpd 镜像。

docker 公共仓库中有各大厂商提供的官方镜像,也有个人制作的镜像(比如,我自己打包的 tansong0091/httpd-ssh)。

docker 公共仓库地址如下,我们在这里也可以搜索镜像及版本说明 https://hub.docker.com/repositories

图 26




我们用如下命令 pull 镜像

#pull最新的httpd镜像docker pull httpd#相当于运行docker pull httpd:latest#pull指定版本的镜像docker pull httpd:2.4我们直接拉一个最新版本的 httpd 镜像

图 2




pull 完成后,用下列命令查看镜像

docker images|grep httpd图 27




也可以在 docker desktop 中看到新镜像

图 6




生成容器(运行镜像)

下面我们先运行一个最简单的容器,执行以下命令

docker run -d -p 80:80 httpd说明:

图 3




用下列命令查看正在运行的容器

docker ps图 4

说明:

现在只有一个容器在运行,由 httpd 镜像生成,端口映射 80:80

在 docker desktop 中也可以看到新的容器正在运行

图 7




这时我们在网站中打开“http://localhost”,可以看到httpd的网站测试页面已经打开了

图 5




可以看到用 docker 在本地运行一个网站非常简单,pull 一个镜像,生成容器,然后网站就可以访问了。

但此时运行的 httpd 容器和我们的系统是分隔开的,如何把我们自己的内容部署到这个容器中?

我们介绍两种方法。

2. 容器与本地文件交换

cp

我们可以用 docker cp 命令把文件复制到运行的容器上,或把文件从运行的容器里复制到本地

#从本地复制到容器中docker cp LOCAL_FILE CONTAINER_NAME:/PATH/FILENAME#从容器中复制到本地docker cp CONTAINER_NAME:/PATH/FILENAME LOCAL_FILE我们在本地建一个文件 test.html,内容如下

<p>this is a docker test for readCrapforAWS</p>然后运行如下命令,把这个文件复制到 httpd 容器中

docker cp test.html b4c33aa008f8:/usr/local/apache2/htdocs/test.html说明:b4c33aa008f8 是 CONTAINER ID,这里也可以用容器的 name

图 9




访问http://localhost/test.html,可以看到新网页部署成功,本地文件成功复制到容器中

图 10




exec

在上面的步骤中,我们把本地文件复制到了容器的/usr/local/apache2/htdocs 目录下。

但是如果我不知道里面的文件夹结构,或者我想直接修改 httpd 容器里的配置文件,这时该怎么办?

我们可以用 exec 的命令进入容器内部进行查看修改。

运行下列命令进行容器内部

docker exec -it b4c33aa008f8 bash说明:

这时可以看到,我们已经进入容器的内部了。现在我们可以在编辑 httpd.conf 文件修改参数了。

图 11




如需退出容器,输入 exit

图 12




说明:

  1. httpd 镜像本身没有提供 vim 编辑器,所以需要手工安装
#可以直接连接internetapt-get updateapt-get install vim#需要代理连接internetapt-get -o Acquire::http::proxy="http://YOUR_PROXY_SERVER:PORT" updateapt-get -o Acquire::http::proxy="http://YOUR_PROXY_SERVER:PORT" install vim
  1. 在 httpd 容器内部修改 httpd.conf 文件后,需要重启容器生效时,可以用如下命令
docker restart b4c33aa008f8图 13




volume

除了用 cp 命令把部署文件复制到容器内部,我们还可以把本地文件夹映射到容器中,这样本地文件夹的内容直接在容器中可见。

运行以下命令,先把容器中的/usr/local/apache2/conf 文件夹复制到本地

docker cp b4c33aa008f8:/usr/local/apache2/conf ./图 14




然后运行下列两条命令,停止容器并删除

docker stop b4c33aa008f8docker rm b4c33aa008f8图 15




然后我们在本地再创建两个文件夹

mkdir htdocsmkdir logs运行以下命令重新建一个容器

docker run -d -p 80:80 / --name tshttpd / --restart=always / -v /home/tans/Docker/conf:/usr/local/apache2/conf / -v /home/tans/Docker/logs:/usr/local/apache2/logs / -v /home/tans/Docker/htdocs:/usr/local/apache2/htdocs / httpd:latest说明:

现在我们重新建了一个容器,并把三个本地文件夹映射到了容器内部

图 16




我们把刚才建的 test.html 文件,移动到刚才建的本地 htdocs 目录

mv test.html htdocs/然后我们进入容器(现在我们可以用容器名称进入容器了)

docker exec -it tshttpd bash图 17

说明:

进入容器的 htdocs 目录,可以看到我们在本地文件夹 htdocs 中的文件 test.html

现在有了卷映射,我们无需再把部署文件复制到容器内部,只需要把部署文件复制到映射目录,容器中就可以看到这些文件了。

注意:在使用 volume 时,如果在容器内访问映射进来的文件提示没有权限时,我们需要把本地文件的属主 UID 数字改成容器内用户的 UID 数字

3. 编译镜像

有时在公共仓库中下载的镜像并不能满足我们的需要,这时我们可以自行编译镜像,安装我们需要的软件。

我们以“AWS ECS Fargate 容器调试”一文中的 Dockerfile 为例,讲述如何自己编译镜像。

这个镜像把 openssh 加入 httpd 镜像中,使得我们可以用 ssh 命令远程登入容器内部,这个功能对无服器模式的 docker 环境调试非常有用,比如 ECS Fargate。

Dockerfile

编译镜像,主要就是编辑 Dockerfile 这个文件,在这文件中指定基础镜像,安装软件及暴露端口等。

复制 httpd-ssh 文件夹如下(资源下载中可下载)

tans@GDSVGQQ2E:~/Docker$ tree httpd-ssh/httpd-ssh/├── Dockerfile├── conf│ ├── htaccess│ ├── httpd.conf│ └── sshd_config├── entrypoint.sh├── runscript└── test.htmlDockerfile 文件内容如下

#1FROM httpd:2.4#2COPY ./test.html/ /usr/local/apache2/htdocs/dist/test.htmlCOPY entrypoint.sh /entrypoint.shCOPY conf/httpd.conf /usr/local/apache2/conf/#3RUN apt-get -o Acquire::http::proxy="http://YOUR_PROXY_SERVIER:PORT/" update / && apt-get -o Acquire::http::proxy="http://YOUR_PROXY_SERVIER:PORT/" install -y vim procps openssh-server / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime / && echo "Asia/Shanghai" > /etc/timezone / && mkdir -p /var/run/sshd / # SSH login fix. Otherwise user is kicked off after login && sed -i 's@session/s*required/s*pam_loginuid.so@session optional pam_loginuid.so@g' /etc/pam.d/sshdCOPY conf/sshd_config /etc/ssh/sshd_config#4EXPOSE 80 22#5ENTRYPOINT ["/entrypoint.sh"]说明:

我们可以在镜像里安装任意软件,比如我们可以安装一套 php,apache,mysql 在一个镜像文件中。

需要注意的是,镜像一般以简化的 linux 系统(比如 Alpine linux)为主,所以一般需要自己解决软件的依赖包。

我们再来看一下 entrypoint.sh 文件的内容

#!/bin/shHOST=`hostname`echo "export HOSTNAME=$HOST" >>/usr/local/apache2/bin/envvars#1/usr/local/apache2/bin/apachectl start#2# Create a folder to store user's SSH keys if it does not exist.USER_SSH_KEYS_FOLDER=~/.ssh[ ! -d "$USER_SSH_KEYS_FOLDER" ] && mkdir -p $USER_SSH_KEYS_FOLDER && chmod 700 $USER_SSH_KEYS_FOLDER && echo $SSH_PUBLIC_KEY > ${USER_SSH_KEYS_FOLDER}/authorized_keysunset SSH_PUBLIC_KEY# Start the SSH daemon.#3/usr/sbin/sshd -D说明:

如果我们希望容器启动之后一直运行,那么 entrypoint.sh 最后一条命令必须是前台命令(前台命令是指运行后,命令在前台显示不会退出)。

否则容器启动后,运行完 entrypoint.sh 中所有命令之后便会退出停止。

生成镜像

运行下面的命令编译新镜像

docker build --tag tshttpd-ssh .图 18




编译完成

图 19




用下列命令查看当前的镜像

docker images图 20




运行并测试

下面我们用新镜像重新创建容器

docker stop tshttpddocker rm tshttpddocker run -d -p 80:80 / -p 10022:22 / --name tshttpd / --restart=always / -e SSH_PUBLIC_KEY="ssh-rsa AAAAB3 ... wNIt5dFd9wQ85X8sYcZ4M0TEq8i9BDOmEH7QZiXjCf6nYIzATG3GNyflAPWkA70BHEDtIo7x1TsCsjumqwl1qXvuZLxx/sunx/Sew==" / -v /home/tans/Docker/conf:/usr/local/apache2/conf / -v /home/tans/Docker/logs:/usr/local/apache2/logs / -v /home/tans/Docker/htdocs:/usr/local/apache2/htdocs / tshttpd-ssh:latest说明:

图 21




现在我们用 ssh 登录测试一下

sudo ssh -i id_rsa_ts localhost -p22登录成功,可以看到容器内正在跑的 httpd 进程和 sshd 进程

图 22




接下来我们可以把这个新镜像打 tag 后推私人或公共仓库,以供后继使用。

4. 运行容器作为 mysql 客户端

除了运行容器做为网站服务器,我们还可以利用用完即删除的容器做为各种工具客户端。

比如,我想测试一下到远程 mysql 的数据库用户连接是否正常。

一般这种情况,我们需要要在本机上安装一个对应版本的 mysql 客户端软件。

但有了 docker 就不需要这么做了。我们可以 pull 一个 mysql 镜像,然后启用一个临时的容器做为客户端。

比如我想远程连接一个 mysql8 数据库,但我又不想在本机上装 mysql 客户端。

那么可以直接运行以下命令连接 mysql

docker run --rm -it mysql:8.0.19 mysql -hYOUR_MYSQL_SERVER_IP -PYOUR_MYSQL_PORT -uroot -pYOUR_MYSQL_PWD如果本机没有 mysql:8.0.19 的镜像,则 docker 会自动 pull 后登录

图 23




如果已经存在 mysql:8.0.19 的镜像,则会直接登录

图 24




exit 退出 mysql 后,这个临时的 mysql 容器会自动删除(--rm)

如果连镜像也不需要了,可以用下列命令删除镜像

docker rmi mysql:8.0.19图 25




总结

docker 使用起来没有那么难,简单来说就两步

  1. pull 镜像
  2. 生成容器
熟练之后,我们可以

  1. 自己编译镜像
  2. 用 docker-compose 定义多个容器的应用,控制启动顺序等
  3. 使用其它容器编排工具帮我们管理容器,比如 k8s
Dockderfile 还有许多其它命令,环境变量可以设置,可以参考 Docker 官网文档继续学习。

引申

上面说过容器启动后运行 entrypoint.sh 脚本的最后一条命令必须是前台命令,否则容器会退出。

当最后一条命令不是前台命令时,执行完全部命令就会自动退出。我们可以利用这个特性,把容器当成执行一次性任务的实例。

比如我们需要定期从本地复制数据到 AWS 云上某数据库。

我们可以把复杂的相关操作做成一个镜像,然后利用 AWS Cron 定时启动容器。

容器启动后运行命令复制数据,复制完成后就会自动退出容器并删除。

资源下载

httpd-ssh 文件夹可以下列链接下载 https://github.com/tansong0091/realCrapForAWS/tree/main/CDK_DOCKERIMAGE

后记

看完这篇文章,动手实践一下,再看看 Docker 官网的文档,基本上使用 Docker 就问题不大了。

对 Docker 使用有了感觉,使用其它容器编排工具就简单多了,因为不论编排工具的命令是什么,下层总是在运行容器。




喜欢请点赞,禁止转载,转发请标明出处

关注 B 站 UP 主“我是手拉面” 观看更多视频

关注GZH“全是 AWS 干货”查看更多内容

关键词:基础,实战

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭