在使用Docker创建Apache-MariaDB环境时,我成功地使它们一起运行了一次
我們先嘗試在Docker容器中建立一個能運行Apache和MariaDB的環境。簡單方便地將Apache和MariaDB容器結合在一起並運行。
运行httpd
首先尝试运行httpd。
根据httpd官方镜像的How to use this image的说明,创建一个Dockerfile。
FROM httpd
copy ./public-html /usr/local/apache2/htdocs
如何使用此图像,并稍作更改,未指定版本。
将Dockerfile放置在一个名为public-html的文件夹的目录中。将放置在其中的文件复制到路径/usr/local/apache2/htdocs下。也就是说,将放置在public-html中的网页可以在Docker容器的httpd中查询。
但是,由于目前比较麻烦,所以暂时只创建一个空的文件夹。
然后,按照”How to use this image”中的说明,尝试进行docker build和docker run。
# docker build -t my-apache2 .
Sending build context to Docker daemon 2.56kB
Step 1/2 : FROM httpd
---> b2c2ab6dcf2e
Step 2/2 : copy ./public-html /usr/local/apache2/htdocs/
---> Using cache
---> add9ae831e3f
Successfully built add9ae831e3f
Successfully tagged my-apache2:latest
最后的句点(.)也要记住。 de (.) yě .)
# docker run -dit --name my-running-app -p 8080:80 my-apache2
6104875a4074cb1700ee4e0b7d3ad7ba56031d14f4aabf52333c56491149586f
— 根据容器的名称参数进行自由命名。通过使用docker ps等命令来引用容器时,所命名的容器名称将显示出来。在使用rm命令删除容器时,不仅可以根据容器ID指定删除,还可以根据容器的名称进行删除。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6104875a4074 my-apache2 "httpd-foreground" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp my-running-app
-p后面是端口号,前面是主机服务器的端口,后面是容器的端口。对于apache来说,默认端口是80,所以需要设置将主机服务器的哪个端口与其连接。
后面是镜像的名称。
现在Apache已经启动了,你可以尝试用curl进行连接测试。
curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>
因为不是浏览器,所以即使被说“它运作了!”,但感受不够强烈。
不过确实在运行。
运行MariaDB
这次我要尝试运行MariaDB的官方镜像。
我也按照MariasDB官方镜像的使用说明来尝试。
# docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=p@ssw0rd -d mariadb:latest
dbd435416b056b9b0f207ec0d36e60a0bc7fb8eacd9670bc88be2f1ac25f6c6e
・请起立。
・MYSQL_ROOT_PASSWORD是用来指定将密码设置为root的密码的参数,请指定一个合适的密码(别忘了),如果忘记了,将无法访问数据库。
・mariadb:tag中的“tag”是用来指定所需mariadb版本的。请在官方镜像页面的“Supported tags and respective Dockerfile links”部分中选择一个版本进行指定。不能直接使用“tag”。
顺便说一下,“–name”可以使用任意喜欢的名称,或者还可以保持示例中的“some-mariadb”。
现在虽然已经上去了,但这样下去有点不知所措。试着进入容器内部看看。尝试执行位于“official image的Container shell access and viewing MySQL logs”中的docker exec命令。
# docker exec -it some-mariadb bash
root@dbd435416b05:/#
当显示Mariadb容器的命令提示符时,登录Mariadb进行尝试。
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.12-MariaDB-1:10.4.12+maria~bionic mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
密码是在执行docker run命令时指定的(在这个例子中是p@ssw0rd)。我已经成功地放入了mariaDB中。
3. 试试将它们组合在一起
OK,我们要让httpd(即Web服务器)可以访问mariaDB(即DB服务器),我们该怎么做呢?
因为它们作为各自的服务器已经启动,所以只需要确保它们之间能够建立网络连接就可以了,这需要用到docker吗?
在这里登场的是docker-compose。许多人可能只是随便输入命令而已。毕竟只要能运行,无论是docker还是docker-compose都可以。
然而!正是这种心态造就了一个充满了咒语的神秘系统!是的,就是这样!
因此,我将带着新的心态来使用docker-compose。
要使用docker-compose,首先要创建一个docker-compose.yml文件。
如果您搜索一下,会有很多示例,但具体的命令可能不容易理解。
这时候我参考了Docker Compose – docker-compose.yml 参考文档,非常感谢。
基于这个,我准备创建我想要的docker-compose.yml。
顺便提一下,目录结构大致如下。
── dockerfiles ┬─ docker-compose.yml
└─ httpd ┬─ Dockerfiles
└─ public-html ─(サイトデータ)
试着模仿并创建一个docker-compose.yml文件。
version: "3"
services:
web:
build: ./httpd
ports:
- "8080:80"
db:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: p@ssw0rd
ports:
- "3306:3306"
volumes:
- /usr/local/mariadb:/var/lib/mysql
【解释】
版本:docker-compose的版本
服务:描述容器配置等的块。
web:自己随便起的名字1。在这里描述httpd容器的配置。
构建:指定要运行的容器的Dockerfile位置。
端口:公开端口。在主机:容器之间配置,在主机上配置的端口上访问容器,在容器内通过容器指定的端口连接。
db:自己随便起的名字2。在这里描述mariaDB容器。
镜像:mariaDB直接从镜像启动而不通过Dockerfile创建,所以要指定镜像而不是构建。
环境变量:存放设置等参数的地方。在启动mariaDB容器时,需要设置root密码,所以暂时只放入那个设置。
卷:将指定路径挂载为卷。如果在主机:容器中指定,则在主机的路径上写入数据。就是所谓的持久化。
※设置卷后,数据将保存在主机上,每次启动时都会挂载指定目录并使用它。虽然数据不会丢失,但无论是删除容器还是删除镜像,在挂载目录的情况下,仍将继续使用那些数据。一旦开始运营,这是件好事,但在初始设置时要特别注意,如果犯了个”啊,弄错了,再来一次”的错误,需要删除主机上的数据,否则旧数据将一直被挂载。我就曾经陷入了这个坑中。
暂时只写这么多,试着运行一下看看。
运行时请在包含docker-compose.yml文件的目录下执行。
# docker-compose up -d
Creating network "dockerfiles_default" with the default driver
Building web
Step 1/2 : FROM httpd
latest: Pulling from library/httpd
54fec2fa59d0: Pull complete
8219e18ac429: Pull complete
3ae1b816f5e1: Pull complete
a5aa59ad8b5e: Pull complete
4f6febfae8db: Pull complete
Digest: sha256:c9e4386ebcdf0583204e7a54d7a827577b5ff98b932c498e9ee603f7050db1c1
Status: Downloaded newer image for httpd:latest
---> b2c2ab6dcf2e
Step 2/2 : copy ./public-html /usr/local/apache2/htdocs/
---> d09171cc2002
Successfully built d09171cc2002
Successfully tagged dockerfiles_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Pulling db (mariadb:latest)...
latest: Pulling from library/mariadb
23884877105a: Pull complete
bc38caa0f5b9: Pull complete
2910811b6c42: Pull complete
36505266dcc6: Pull complete
e69dcc78e96e: Pull complete
222f44c5392d: Pull complete
efc64ea97b9c: Pull complete
9912a149de6b: Pull complete
7ef6cf5b5697: Pull complete
8a05be3688e0: Pull complete
c09ffdc1b660: Pull complete
2eb7fe288fc8: Pull complete
b41d1cc4d40f: Pull complete
a92376500910: Pull complete
Digest: sha256:379f3689cfcd53fd561c1aa2aea0a336a2362c9d31306528228321344a9cf979
Status: Downloaded newer image for mariadb:latest
Creating dockerfiles_web_1 ... done
Creating dockerfiles_db_1 ... done
似乎有点动了。
尝试使用docker exec进入各自的环境。
# docker exec -it dockerfiles_db_1 bash
root@c067115a3e06:/# mysql -root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.12-MariaDB-1:10.4.12+maria~bionic mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
# curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>
总之,先行动起来了。但是因为完全没有进行设置,所以还不能说已经成功连接了。
在此暂时公开至此。之后希望能够实际在web服务器上安装一些东西并尝试进行数据库访问等等(羡慕的眼神)。
在那之前,请暂时告别吧!朋友!!