参考文章: Docker 从入门到实践
实战 Django
我们现在将使用 Docker Compose 配置并运行一个 Django/PostgreSQL
应用。在一切工作开始之前,需要准备三个必要的文件:
- Dockerfile: 指定Docker 容器要安装运行的内容;
- requirements.txt: 指定容器内 Python 需要安装的模块;
- docker-compose.yml: 将所有的内容关联起来,描述应用的构成。
编写 Dockerfile
因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 Dockerfile 文件来指定 Docker 容器要安装的内容,如下:
1 | FROM python:3 |
以上内容指定应用将使用安装了 Python3 以及必要依赖包的镜像。
准备 requirements.txt 文件
在当前目录下新建一个 requirements.txt
文件,文件内容如下:
1 | Django>=2.0,<3.0 |
编写 docker-compose.yml 文件
docker-compose.yml
文件将把所有的东西关联起来,它描述了应用的构成(一个 web
服务和一个数据库),使用 Docker 镜像,镜像之间的连接,挂载到容器的卷,以及服务开放的端口。
1 | version: "3.9" |
启动应用
接下来,我们就可以使用
docker-compose run
命令启动一个 Django 应用了。1
docker-compose run web django-admin startptoject django_example .
由于 web 服务所使用的的镜像并不存在,所以 Compose 会首先使用 Dockerfile 为 web 服务构建一个镜像,接着使用这个镜像在容器里运行
django-admin startptoject django_example
指令。这将生成一个 Django 应用1
2ls
django_example docker-compose.yml Dockerfile manage.py requirements.txt如果系统是 Linux,记得修改文件权限
1
sudo chown -R $USER:$USER .
设置应用的数据库连接信息。编辑
django_example/settings.py
文件,修改DATABASES
字段内容,如下:1
2
3
4
5
6
7
8
9
10DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
'PASSWORD': 'postgres'
}
}这些信息是在 postgres 镜像固定设置好的。然后运行
docker-compose up
:1
2
3
4
5
6
7
8
9docker-compose up
...
web_1 |
web_1 | You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
web_1 | Run 'python manage.py migrate' to apply them.
web_1 | December 31, 2020 - 15:51:41
web_1 | Django version 2.2.17, using settings 'django_example.settings'
web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.这个 Django 应用已经开始在你的 Docker 守护进程里监听着 8000 端口了。打开
127.0.0.1:8000
即可看到 Django 欢迎页面。你还可以在 Docker 上运行其他的管理命令,例如对于同步数据库结构这种事,在运行完
docker-compose up
后,在另一个终端进入文件夹运行以下命令即可:1
docker-compose run web python manage.py syncdb
实战 WordPress
Compose 可以很便捷的让 WordPress 运行在一个独立的环境中。
创建 workpress 项目文件夹
1 | mkdir wordpress |
创建 docker-compose.yml 文件
docker-compose.yml 文件将开启一个 WordPress 服务和一个独立的 MySQL 实例。
1 | version: "3" |
构建并运行项目
运行以下命令 ,Compose 就会拉取镜像再创建我们所需要的镜像,然后启动 wordpress 和数据库容器。接着访问 127.0.0.1:8000 端口就能看到 WordPress 安装界面。
1 | docker-compose up -d |
实战 LNMP 环境
创建项目需要用到的文件目录
创建 LNMP 项目文件夹
1 | mkdir -p lnmp/{nginx,mysql,php} |
创建 MySQL 相关配置
创建 MySQL 配置文件 lnmp/mysql/my.cnf,内容如下:
1 | [client] |
创建 Nginx 相关配置
下载 Nginx 源码文件到 lnmp/nginx 目录
1
wget -P lnmp/nginx/ wget http://nginx.org/download/nginx-1.18.0.tar.gz
创建 Nginx 容器 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54FROM centos:7
MAINTAINER wanwu<2350686113@qq.com>
ENV TIME_ZONE=Asia/Shanghai
ARG NGINX_ROOT=/usr/local/nginx
ARG LOG_DIR=/var/log/nginx
LABEL auther="wanwu" mail="2350686113@qq.com"
ADD nginx-1.18.0.tar.gz /tmp
RUN useradd -s /sbin/nologin -M nginx \
&& sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/*.repo \
&& yum clean all && yum makecache \
&& yum install -y gcc gcc-c++ make pcre gd-devel zlib zlib-devel \
libxml2 libxml2-devel libxslt libxslt-devel openssl openssl-devel pcre-devel \
&& cd /tmp/nginx-1.18.0 \
&& ./configure \
--prefix=${NGINX_ROOT} \
--user=nginx \
--group=nginx \
--error-log-path=${LOG_DIR}/error.log \
--http-log-path=${LOG_DIR}/access.log \
--http-client-body-temp-path=${NGINX_ROOT}/client_body_temp \
--http-proxy-temp-path=${NGINX_ROOT}/proxy_temp \
--http-fastcgi-temp-path=${NGINX_ROOT}/fastcgi_temp \
--http-uwsgi-temp-path=${NGINX_ROOT}/uwsgi_temp \
--http-scgi-temp-path=${NGINX_ROOT}/scgi_temp \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx \
--with-debug \
--with-pcre-jit \
--with-ipv6 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_auth_request_module \
--with-http_addition_module \
--with-http_dav_module \
--with-http_gunzip_module \
--with-http_image_filter_module \
--with-http_sub_module \
--with-http_xslt_module \
--with-http_gzip_static_module \
--with-pcre \
--with-http_realip_module \
--with-stream \
&& make -j 2 && make install \
&& rm -rf /tmp/nginx* \
&& yum remove -y gcc gcc-c++ make gd-devel zlib-devel libxml2-devel libxslt-devel openssl-devel pcre-devel \
&& yum clean all \
&& rm -rf /var/cache/yum/* \
&& rm -rf ~/.cache \
&& echo "${TIME_ZONE}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \
&& chown -R nginx:nginx /usr/local/nginx
EXPOSE 80 443
WORKDIR /usr/local/nginx/
CMD ["./sbin/nginx", "-g", "daemon off;"]
创建 PHP 相关文件
获取 php 源码包
1
wget -P lnmp/php/ http://mirrors.sohu.com/php/php-7.4.9.tar.xz
创建 Dockerfile 文件
1 | FROM centos:7 |