Docker 再探 — 使用 docker-compose 搭建完整的 lnmp 开发环境(3/3)
继上次使用 Docker-compose 安装 lnmp 环境之后,经过几天的学习,对 Docker 有了一个比较完整的认识,接下来就安装一个比较完善的 lnmp 环境!
下面是该项目的目录结构
.. . ├── db │ └── myconf │ └── my.cnf │ └── mydata │ └── redisconf │ └── redis.conf │ └── redisdata │ └── mongoconf │ └── MysqlDockerFile ├── nginx │ └── conf.d │ └── default.conf │ └── nginx.conf │ └── logs │ └── DockerFile ├── php │ └── DockerFile │ └── php_fpm_conf │ └── php_ini.d │ └── php.ini ├── node │ └── node_modules ├── www │ └── default.com ├── docker-compose.yml
以下是docker-compose.yml
文件内容,仅供参考
version: "3" services: nginx: container_name: nginx build: context: ./nginx dockerfile: DockerFile privileged: true restart: always networks: - lnmp_cluster ports: - "80:80" - "443:443" volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/logs:/var/log/nginx - ./www:/usr/share/nginx/html depends_on: - php php: container_name: php8 build: context: ./php dockerfile: DockerFile privileged: true restart: always volumes: - ./www:/usr/share/nginx/html environment - TZ=Asia/Shanghai networks: - lnmp_cluster links: - mysql - redis redis: container_name: redis image: redis privileged: true restart: always volumes: - ./db/redisdata:/data - ./db/redisconf:/etc/redis ports: - "6379:6379" networks: - lnmp_cluster command: redis-server /etc/redis/redis.conf expose: - "6379" nodejs: container_name: nodejs image: node privileged: true restart: always tty: true volumes: - ./node/node_modules:/usr/local/lib/node_modules - ./www:/usr/share/nginx/html ports: - "3000:3000" networks: - lnmp_cluster expose: - "3000" mysql: container_name: mysql image: mysql privileged: true restart: always volumes: - ./db/myconf:/etc/mysql/conf.d - ./db/my_data:/var/lib/mysql ports: - "3306:3306" command: > bash -c " chmod 644 /etc/mysql/conf.d/*.cnf && /entrypoint.sh mysqld " environment: MYSQL_ROOT_PASSWORD: 111111 MYSQL_DATABASE: test MYSQL_USER: user MYSQL_PASSWORD: user123 networks: - lnmp_cluster expose: - "3306" networks: lnmp_cluster: name: lnmp_cluster
其中 php 和 nginx 采用了 build 的方式加载新的 image
php 需要安装 n 多的扩展库
#php DockerFile FROM php:8.0.1-fpm RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list RUN cat /etc/apt/sources.list RUN rm -Rf /var/lib/apt/lists/* RUN apt-get update RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd RUN docker-php-ext-install -j$(nproc) bcmath sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm calendar exif gettext RUN apt-get update && apt-get install -y \ libbz2-dev \ libenchant-dev \ libgmp-dev \ libxml2-dev \ libtidy-dev \ libxslt1-dev \ libzip-dev \ libsnmp-dev \ librecode-dev \ libc-client-dev \ libkrb5-dev \ libmcrypt-dev \ zlib1g-dev \ libmemcached-dev RUN docker-php-ext-install -j$(nproc) bz2 RUN docker-php-ext-install -j$(nproc) enchant RUN docker-php-ext-install -j$(nproc) gmp RUN docker-php-ext-install -j$(nproc) soap tidy xsl RUN docker-php-ext-install -j$(nproc) zip RUN docker-php-ext-install -j$(nproc) snmp RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl && \ docker-php-ext-install -j$(nproc) imap RUN pecl install mcrypt-1.0.4 RUN pecl install redis-5.3.2 RUN pecl install memcached RUN pecl install xdebug RUN docker-php-ext-enable redis xdebug memcached mcrypt RUN pecl install swoole RUN docker-php-ext-enable swoole RUN pecl install mongodb RUN docker-php-ext-enable mongodb
nginx 则只是把当前目录下的 nginx.conf 复制到/etc/nginx/nginx.conf
#nginx DockerFile FROM nginx COPY nginx.conf /etc/nginx/nginx.conf
一些需要注意的坑!
这两天在使用 docker 配置我的 lnmp 开发环境的时候遇到很多问题!
这个貌似只能通过 docker cp ...:... ...
命令的方式才可以从镜像中复制文件到外界
而且不支持批量复制(cp /* ..),且只支持单个文件或文件夹的复制.
如果使用 docker 部署了一个 nginx 应用,我需要对 nginx.conf 来进行更改,就必须从外界挂载一个配置文件到 nginx.conf,但是此时我并不知道 docker 中 nginx.conf 的内容,而且可能也不知道它的确切位置
这样只能先创建一个实例,然后使用docker cp
的命令将需要的配置文件复制出来放到挂载的目录里,然后再修改 docker-compose 文件挂载到镜像中!
安装 nginx php redis node 的时候几乎都碰到了这种问题,很头疼!
将 docker 镜像运行起来之后在里面把自己更改的东西都修改完善,然后再自己打个 image 包,上传至 hub.docker.com,然后修改 docker-compose.yml 文件,将 image 改为自己的包名,这样也就牺牲了随时调整配置文件的方便
或者使用 docker exec 命令进入到镜像环境中去修改相应配置项,这个也是很麻烦!