GVKun编程网logo

转载 江南一点雨 一键部署 docker(江南一点雨 博客项目)

8

在这篇文章中,我们将带领您了解转载江南一点雨一键部署docker的全貌,包括江南一点雨博客项目的相关情况。同时,我们还将为您介绍有关8天入门docker系列——第五天使用aspnetcore小案例熟悉

在这篇文章中,我们将带领您了解转载 江南一点雨 一键部署 docker的全貌,包括江南一点雨 博客项目的相关情况。同时,我们还将为您介绍有关8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署、Centos7一键部署Docker脚本、Docker Compose 一键部署 LNMP、Docker 脚本化一键部署的知识,以帮助您更好地理解这个主题。

本文目录一览:

转载 江南一点雨 一键部署 docker(江南一点雨 博客项目)

转载 江南一点雨 一键部署 docker(江南一点雨 博客项目)

一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!

 

不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案。

不同于传统的单体应用,微服务由于服务数量众多,在部署的时候出问题的可能性更大,这个时候,结合 Docker 来部署,就可以很好的解决这个问题,这也是目前使用较多的方案之一。

将 Spring Boot 项目打包到 Docker 容器中部署,有很多不同的方法,今天松哥主要来和大家聊一聊如何将 Spring Boot 项目一键打包到远程 Docker 容器,然后通过运行一个镜像的方式来启动一个 Spring Boot 项目。

至于其他的 Spring Boot 结合 Docker 的用法,大家不要着急,后续的文章,松哥会和大家慢慢的一一道来。

1. 准备工作

1.1 准备 Docker

我这里以 CentOS7 为例来给大家演示。

首先需要在 CentOS7 上安装好 Docker,这个安装方式网上很多,我就不多说了,我自己去年写过一个 Docker 入门教程,大家可以在公众号后台回复 Docker 获取教程下载地址。

Docker 安装成功之后,我们首先需要修改 Docker 配置,开启允许远程访问 Docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,加入如下内容:

-H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

如下图:

配置完成后,保存退出,然后重启 Docker:

systemctl daemon-reload    
service docker restart 

Docker 重启成功之后,Docker 的准备工作就算是 OK 了。

1.2 准备 IDEA

IDEA 上的准备工作,主要是安装一个 Docker 插件,点击 File->Settings->Plugins->Browse Repositories 如下:

点击右边绿色的 Install 按钮,完成安装,安装完成之后需要重启一下 IDEA。

IDEA 重启成功之后,我们依次打开 File->Settings->Build,Execution,Deployment->Docker ,然后配置一下 Docker 的远程连接地址:

配置一下 Docker 的地址,配置完成后,可以看到下面有一个 Connection successful 提示,这个表示 Docker 已经连接上了。

如此之后,我们的准备工作就算是 OK 了。

2. 准备项目

接下来我们来创建一个简单的 Spring Boot 项目(只需要引入 spring-boot-starter-web 依赖即可),项目创建成功之后,我们再创建一个普通的 HelloDockerController,用来做测试,如下:

@RestController
public class HelloDockerController { @GetMapping("/hello") public String hello() { return "hello docker!"; } }

这是一个很简单的接口,无需多说。

3. 配置 Dockerfile

接下来,在项目的根目录下,我创建一个 Dockerfile ,作为我镜像的构建文件,具体位置如下图:

文件内容如下:

FROM hub.c.163.com/library/java:latest
VOLUME /tmp
ADD target/docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这里只有简单的四行,我说一下:

  1. Spring Boot 项目的运行依赖 Java 环境,所以我自己的镜像基于 Java 镜像来构建。
  2. 考虑到 Docker 官方镜像下载较慢,我这里使用了网易提供的 Docker 镜像。
  3. 由于 Spring Boot 运行时需要 tmp 目录,这里数据卷配置一个 /tmp 目录出来。
  4. 将本地 target 目录中打包好的 .jar 文件复制一份新的 到 /app.jar。
  5. 最后就是配置一下启动命令,由于我打包的 jar 已经成为 app.jar 了,所以启动命令也是启动 app.jar。

这是我们配置的一个简单的 Dockerfile。

4. 配置 Maven 插件

接下来在 pom.xml 文件中,添加如下插件:

<plugin>
    <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.0</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <dockerHost>http://192.168.66.131:2375</dockerHost> <imageName>javaboy/${project.artifactId}</imageName> <imageTags> <imageTag>${project.version}</imageTag> </imageTags> <forceTags>true</forceTags> <dockerDirectory>${project.basedir}</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>

这个插件的配置不难理解:

  1. 首先在 execution 节点中配置当执行 mvn package 的时候,顺便也执行一下 docker:build
  2. 然后在 configuration 中分别配置 Docker 的主机地址,镜像的名称,镜像的 tags,其中 dockerDirectory 表示指定 Dockerfile 的位置。
  3. 最后 resource 节点中再配置一下 jar 的位置和名称即可。

OK,做完这些我们就算大功告成了。

5. 打包运行

接下来对项目进行打包,打包完成后,项目会自动构建成一个镜像,并且上传到 Docker 容器中,打包方式如下:

打包过程会稍微有一点旧,因为还包含了镜像的构建,特别是第一次打包,需要下载基础镜像,会更慢一些。

部分打包日志如下(项目构建过程):

项目打包成功之后,我们就可以在 Docker 容器中看到我们刚刚打包成的镜像了,如下:

5.1 运行方式一

此时,我们可以直接在 Linux 上像创建普通容器一样创建这个镜像的容器,然后启动,执行如下命令即可:

docker run -d --name javaboy -p 8080:8080 javaboy/docker:0.0.1

启动成功之后,我们就可以访问容器中的接口了。

但是这种操作显然还是有点麻烦,结合我们一开始安装的 Docker 插件,这个运行步骤还可以做进一步的简化。

5.2 运行方式二

大家注意,此时我们的 IDEA 中多了一个选项,就是 docker,如下:

点击左边的绿色启动按钮,连接上 Docker 容器,连接成功之后,我们就可以看到目前 Docker 中的所有容器和镜像了,当然也包括我们刚刚创建的 Docker 镜像,如下:

此时,我们选中这个镜像,右键单击,即可基于此镜像创建出一个容器,如下图:

我们选择 Create container,然后填入容器的一些必要信息,配置一下容器名称,镜像 ID 会自动填上,暴露的端口使用 Specify 即可,然后写上端口的映射关系:

配置完成后,点击下方的 run 按钮,就可以开始运行了。运行日志如下:

注意,这个日志是在 Docker 的那个窗口里打印出来的。

项目运行成功之后,在浏览器输入远程服务器的地址,就可以访问了:

如此之后,我们的 Spring Boot 项目就算顺利发布到远程 Docker 容器中了。

好玩吗?试试!

本文案例我已经上传到 GitHub,小伙伴们可以参考:https://github.com/lenve/javaboy-code-samples​

8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

 

  这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook

总要和一些数据库打交道吧,比如说mysql,mongodb,redis,通常情况下这些存储设备要么是以容器的方式承载,要么是由DBA在非容器环境下统一管理。

 

一:webnotebook连接容器redis

       我们做一个小案例,把网站的所有PV记录到redis中,webnotebook前端显示当前你是 xxx 位用户,案例不重要,重要的是怎么去实现容器互联。

 

      在docker hub 上去找redis的官方镜像,具体redis该如何合理配置这里我就不管了,用最简单的一条docker run 跑起来再说。

[root@localhost data]# docker run --name some-redis -d redis
Unable to find image ''redis:latest'' locally
latest: Pulling from library/redis
6ae821421a7d: Pull complete 
e3717477b42d: Pull complete 
8e70bf6cc2e6: Pull complete 
0f84ab76ce60: Pull complete 
0903bdecada2: Pull complete 
492876061fbd: Pull complete 
Digest: sha256:dd5b84ce536dffdcab79024f4df5485d010affa09e6c399b215e199a0dca38c4
Status: Downloaded newer image for redis:latest
ed07890700a5cdb7d737a196c28009a9d1b08de35f55d51f53c80e6cfe6ba199
[root@localhost data]# 
[root@localhost data]# 
[root@localhost data]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
ed07890700a5        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp            some-redis

    

    接下来安装 StackExchange.Redis,在Index这个Action中将当前的访问作为一个PV记录到redis中,不过下面的代码要注意一点的就是,为了去访问redis,

这里我采用了redis.webnotebook.com 去映射到redis容器的ip,映射关系可以在创建容器的时候自动追加到 /etc/hosts 中,每一次访问都执行一次Increment自

增操作。

public class HomeController : Controller
    {
        public static Logger logger = LogManager.GetLogger("SimpleDemo");
        public static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("redis.webnotebook.com:6379");

        /// <summary>
        /// 读取mongodb数据数据
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            var db = redis.GetDatabase();

            var num = db.StringIncrement("count");

            ViewData["num"] = num;

            return View();
        }
    }

   

     在UI上,展示下你当前是多少位访客,就是这样。

<div class="text-center">
    <h1 class="display-4">您是当前 @ViewData["num"]  位访客</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

     

     然后你就可以docker build,完了之后docker run时通过 --link  some-redis:redis.webnotebook.com  去指定一下就好了,some-redis是redis容器的名字,

redis.webnotebook.com 是这个some-redis别名,这样就方便的实现了 redis.webnotebook.com和容器ip的映射关系。

[root@localhost publish]# docker run -d --name webnotebook -p 8080:8080 --link some-redis:redis.webnotebook.com huangxincheng/webnotebook:v1
b931e040de26c4bfc0b49cbc8e626cdcb30ad9bdff523f623c0a2d6c50899a81
[root@localhost publish]# 
[root@localhost publish]# 
[root@localhost publish]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
b931e040de26        huangxincheng/webnotebook:v1   "dotnet WebNotebook.…"   2 seconds ago       Up 2 seconds        0.0.0.0:8080->8080/tcp   webnotebook
ed07890700a5        redis                          "docker-entrypoint.s…"   27 minutes ago      Up 27 minutes       6379/tcp                 some-redis

       有些人可能就好奇了,到底webnotebook容器内的/etc/hosts真的修改了吗? 接下来你可以通过 docker exec 到webnotebook容器去看一下就好啦,

从下面标红的地方可以看到,172.17.0.2 已经和 xxx.com 做了映射。

[root@localhost publish]# docker exec -it webnotebook /bin/bash
root@b931e040de26:/data# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    redis.webnotebook.com ed07890700a5 some-redis
172.17.0.3    b931e040de26
root@b931e040de26:/data#

 

     回到文章开头的问题,如果redis是在远程宿主机上部署的,那我的webnotebook容器该怎么访问呢?你可能会说,直接通过ip访问即可,但是为了保持

统一性,我还是希望通过redis.webnotebook.com 这个域名进行访问,也就是说怎么去把这个映射关系追加到容器中呢?可以使用-- add-host来实现。

[root@localhost publish]#  docker run -d --name webnotebook -p 8080:8080 --add-host redis.webnotebook.com:172.17.0.2 huangxincheng/webnotebook:v1
91e7d9c1b575cc34ae98eebfc437d081b852f450104e2b368f898299852b0f18
[root@localhost publish]# docker exec -it webnotebook /bin/bash
root@91e7d9c1b575:/data# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    redis.webnotebook.com
172.17.0.3    91e7d9c1b575
root@91e7d9c1b575:/data#

   

二:docker-compose 容器编排

      目前我们仅引入了redis,这样有了两个容器,但随着业务的增加,你可能还需要mysql,ssdb,rabbitmq,nginx等服务,而docker建议的就是一个容器

一个进程,那为了能顺利承载这些服务,你可能需要部署6个容器,如果你还是按照老一套的方法一个一个的去部署,操作起来就比较乱,有没有一种方式可

以让docker自动帮我们一键部署好这些容器呢? 就好像dockerfile那样自动化部署,当然有了,那就是docker-compose 容器编排。

 

1. 安装

    官网地址:https://docs.docker.com/compose/install/#install-compose  然后按照步骤一步一步来就好了,最后通过docker-compose --version 看一下即可。

[root@localhost publish]# sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@localhost publish]# sudo chmod +x /usr/local/bin/docker-compose
[root@localhost publish]# docker-compose --version
docker-compose version 1.22.0, build f46880fe
[root@localhost publish]#

 

2. 编写docker-compose 

    docker-compose的所有命令都在 https://docs.docker.com/compose/compose-file/  上面找得到,如果有兴趣可以查看一下。

version: ''3.0''
services:
  webnotebook:
    container_name: webnotebook
    build: 
      context: .
      dockerfile: ./Dockerfile
    depends_on:
      - redis
    links:
      - "redis:redis.webnotebook.com"
    ports:
      - "8080:8080"
  redis:
   container_name: some-redis
   image: redis

 

   上面的配置看起来不难吧,如果不知道参数的意思,还是那句话,查看官方文档, 最后你可以使用 docker-compose up --build 跑起来,或者使用 -d 参数

进行后台运行。

[root@localhost publish]# docker-compose up --build
Building webnotebook
Step 1/9 : FROM microsoft/dotnet:2.2-aspnetcore-runtime
 ---> dad26d192ae6
Step 2/9 : ENV TZ Asia/Shanghai
 ---> Using cache
 ---> 72535a350c5d
Step 3/9 : LABEL author hxc@qq.com
 ---> Using cache
 ---> d4dcb4ba06aa
Step 4/9 : RUN mkdir /data
 ---> Using cache
 ---> 6bbfc1537e42
Step 5/9 : COPY ./ /data
 ---> Using cache
 ---> 5401b74ec21f
Step 6/9 : WORKDIR /data
 ---> Using cache
 ---> d93e7949b527
Step 7/9 : VOLUME /data/log
 ---> Using cache
 ---> 39c4285c6d6c
Step 8/9 : EXPOSE 8080
 ---> Using cache
 ---> d02932ddfbcc
Step 9/9 : CMD [ "dotnet","WebNotebook.dll" ]
 ---> Using cache
 ---> 0572ceea51a1
Successfully built 0572ceea51a1
Successfully tagged publish_webnotebook:latest
Starting some-redis ... done
Starting webnotebook ... done
Attaching to some-redis, webnotebook
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
some-redis     | 1:M 22 Feb 2019 09:11:03.161 * Running mode=standalone, port=6379.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # Server initialized
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ''vm.overcommit_memory = 1'' to /etc/sysctl.conf and then reboot or run the command ''sysctl vm.overcommit_memory=1'' for this to take effect.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ''echo never > /sys/kernel/mm/transparent_hugepage/enabled'' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 * Ready to accept connections
webnotebook    | : Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
webnotebook    |       User profile is available. Using ''/root/.aspnet/DataProtection-Keys'' as key repository; keys will not be encrypted at rest.
webnotebook    | Hosting environment: Production
webnotebook    | Content root path: /data
webnotebook    | Now listening on: http://[::]:8080
webnotebook    | Application started. Press Ctrl+C to shut down.

非常简单吧,只要我有一个docker-comose文件就可以实现一键部署,好了,希望本篇对你有帮助。

 

原文出处:https://www.cnblogs.com/huangxincheng/p/10419632.html

Centos7一键部署Docker脚本

Centos7一键部署Docker脚本

#!/bin/bash
install_docker(){
#更新yum包
sudo yum update -y
#安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker
sudo yum install docker-ce -y;
#版本查看
docker -v;
#配置镜像加速
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}
EOF
安装docker-compose
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v
#重新启动服务
systemctl daemon-reload;
systemctl restart docker;
#检查加速是否生效
docker info;
#启动docker并设置开机自启动
systemctl enable docker
systemctl start docker
systemctl status docker
docker ps -a 
}
install_docker

Docker Compose 一键部署 LNMP

Docker Compose 一键部署 LNMP

Docker Compose 一键部署 LNMP

目录结构

[root@localhost ~]# tree compose_lnmp/
compose_lnmp/
├── docker-compose.yml
├── mysql
│   ├── conf
│   │   └── my.cnf
│   └── data
├── nginx
│   ├── Dockerfile
│   ├── nginx-1.12.1.tar.gz
│   └── nginx.conf
├── php
│   ├── Dockerfile
│   ├── php-5.6.31.tar.gz
│   └── php.ini
└── wwwroot
└── test.php

一、创建 Nginx Compose

1.1、创建 compose 目录作为 LNMP 的项目管理目录

mkdir compose_lnmp
cd compose_lnmp/

1.2、创建 nginx 管理目录

mkdir nginx
cd nginx

1.3、将 nginx 源码包下载到本地

  • Nginx-1.12.1
  • 下载地址:https://pan.baidu.com/s/1IAdODW63jbpwbQX992coYg
  • 密码:p89j

1.4、创建 Dockerfile 文件

vim Dockerfile

# 指定镜像
FROM centos:6
# 指定管理员
MAINTAINER xiangsikai
# 执行命令安装编译库文件
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
# 添加解压nginx包到/tmp目录下
ADD nginx-1.12.1.tar.gz /tmp
# 进入目录进行编译安装
RUN cd /tmp/nginx-1.12.1 && ./configure --prefix=/usr/local/nginx && make -j 2 && make install
# 删除容器内置配置文件
RUN rm -f /usr/local/nginx/conf/nginx.conf 
# 复制本地配置文件到容器内
COPY nginx.conf /usr/local/nginx/conf
# 声明暴露端口
EXPOSE 80
# 启动容器Nginx服务,指定全局命令daemon off保证服务在前台运行不会关闭
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

1.5、创建 nginx.conf 配置文件

vim nginx.conf

user  root; 
worker_processes  auto; 

error_log  logs/error.log  info;

pid        logs/nginx.pid; 


events {
    use epoll; 
}

http {

    include       mime.types;
    default_type  application/octet-stream;

    log_format  main ''$remote_addr - $remote_user [$time_local] "$request" ''
                      ''$status $body_bytes_sent "$http_referer" ''
                      ''"$http_user_agent" "$http_x_forwarded_for"'';

    access_log logs/access.log main;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name localhost;
        root html;
        index index.html index.php;

        location ~ \.php$ {
            root html;
            fastcgi_pass php-cgi:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
            include fastcgi_params;
        }
    }
}
nginx 配置文件

二、创建 Mysql Compose

2.1、创建 Mysql 管理目录

mkdir mysql
cd mysql
mkdir conf
cd conf

2.2、创建 mysql 配置文件

vim my.cnf

[mysqld]
user=mysql
port=3306
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
pid-file=/var/run/mysqld/mysqld.pid
log_error=/var/log/mysql/error.log
character_set_server = utf8
max_connections=3600
mysql 配置文件

三、创建 PHP Compose

3.1、创建 Mysql 管理目录

mkdir php
cd php

3.2、下载 php 源码包

  • php-5.6.31
  • 下载地址:https://pan.baidu.com/s/17cC8Ad9h4llMb7JC57N1GQ
  • 密码:wl2w

3.3、创建 Dockerfile 文件

vim Dockerfile

# 指定镜像
FROM centos:6
# 指定系统管理员
MAINTAINER xiangsikai
# 安装编译库
RUN yum install -y gcc gcc-c++ gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
# 下载压缩包解压到指定目录
ADD php-5.6.31.tar.gz /tmp/
# 编译安装php,执行相关命令
RUN cd /tmp/php-5.6.31 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && \
    chmod +x /etc/init.d/php-fpm 
# 复制本地配置文件到容器内
COPY php.ini /usr/local/php/etc
# 声明暴露端口
EXPOSE 9000
# 启动php
CMD /etc/init.d/php-fpm start && tail -F /var/log/messages

3.4、创建 php.ini 文件

vim php.ini

[PHP]
engine = On
short_open_tag = Off
asp_tags = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 17
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[CLI Server]
cli_server.color = On
[Date]
date.timezone = Asia/Shanghai
[filter]
[iconv]
[intl]
[sqlite]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = On
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQL]
mysql.allow_local_infile = On
mysql.allow_persistent = On
mysql.cache_size = 2000
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = Off
session.bug_compat_warn = Off
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off
[Assertion]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[mcrypt]
[dba]
php 配置文件

四、创建 DockerCompose 文件

4.1 进入 compose_lnmp 目录下创建 DockerCompose 文件

[root@localhost compose_lnmp]# ls
mysql nginx php

vim docker-compose.yml

# 指定服务版本号
version: ''3''
# 服务
services:
# 服务名称
  nginx:
# 指定服务容器名字
    hostname: nginx
# 构建
    build:
# 指定目录上下文构建镜像
      context: ./nginx
# 指定dockerfile文件名称
      dockerfile: Dockerfile
# 映射数组级的端口
    ports:
      - "80:80"
# 映射php文件服务别名
    links:
      - "php:php-cgi"
# 映射服务数据卷路径
    volumes:
      - ./wwwroot:/usr/local/nginx/html

# 服务名称
  php:
# 指定服务容器名字
    hostname: php
# 构建
    build: ./php
# 映射mysql服务别名
    links:
      - mysql:mysql-db
# 映射服务数据卷路径
    volumes:
      - ./wwwroot:/usr/local/nginx/html

# 服务名称
  mysql:
# 指定服务容器名字
    hostname: mysql
# 指定使用官方mysql5.6版本
    image: mysql:5.6
# 映射端口
    ports:
      - "3306:3306"
# 映射服务数据卷路径
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
# 指定数据库变量
    environment:
# 设置数据库密码
      MYSQL_ROOT_PASSWORD: 123456
# 添加user用户
      MYSQL_USER: user
# 设置user用户密码
      MYSQL_PASSWORD: user123

4.2、执行 docker Compose 一键部署 LNMP

# 需要在yml文件同级目录下执行此命令
docker-compose up

4.3、进入网站目录创建 php 测试页并进行测试

cd wwwroot/
vim test.php
#-----------------
<?php phpinfo()?>
#-----------------

4.4、测试:192.168.1.77/test.php

注:执行 docker-compose up 之前需要关闭 SELINUX。博主踩的坑。

Docker 脚本化一键部署

Docker 脚本化一键部署

Docker

  • install Docker

参照官网

  • install kubernetes

安装kubernetes的时候,需要安装kubelet, kubeadm等包,但k8s官网给的yum源是packages.cloud.google.com,国内访问不了,此时我们可以使用阿里云的yum仓库镜像。

阿里云上没有附Help说明连接,简单摸索了下,如下设置可用(centos)。注意不要开启check。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

开发思路

1 寻找基础镜像
2 基于基础镜像编写Dockerfile脚本
3 根据Dockerfile脚本创建项目镜像
4 将创建的镜像推送到docker仓库 (根据自身需要,可做可不做)
5 基于项目镜像创建并运行docker容器 (实现最终部署)

思路:使用 centos 容器安装对应的软件环境,最后将环境导出。

操作步骤

  1. 创建容器
$ docker pull centos    
$ sudo docker run --privileged --cap-add SYS_ADMIN -e container=docker -it --name my_centos -p 80:8080  -d  --restart=always centos:7 /usr/sbin/init 
  1. 启动容器
$ docker exec -it my_centos /bin/bash
  1. 导出和导入
$ docker export my_centos > /data/app/meifen/my_centos-export-0428.tar

$ docker import  /data/app/meifen/my_centos-export-0428.tar

  1. 保存save

格式:docker save IMAGE(镜像)

使用 docker images 查看本机已有的镜像(也可以使用 docker commit <CONTAIN-ID> <IMAGE-NAME>命令把一个正在运行的容器保存为镜像)

$ docker save 9610cfc68e8d > /data/app/meifen/my_centos-export-0428.tar
  • 加载 load 有点慢,稍微等待一下,没有任何warn信息就表示保存OK。9610cfc68e8d 是镜像ID

现在就可以在任何装 docker 的地方加载 刚保存的镜像了

$ docker load < /home/my_centos-export-0428.tar

其他说明 镜像和容器 导出和导入的区别

1 容器导入 是将当前容器变成一个新的镜像 2 镜像导入 是复制的过程

save 和 export区别

1 save 保存镜像所有的信息-包含历史 2 export 只导出当前的信息

export导出的镜像文件大小 小于 save保存的镜像。export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag <LAYER ID> <IMAGE NAME>);而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。(查看方式:docker images --tree) 。export 只导出当前的信息

提交Docker-hub

  1. 提交镜像
$ docker commit -a "cristic" -m "commit content"  801a40ffa673  cristicmei/name:v1.0.0
  1. 查看镜像
$ docker images
  1. 登录docker-hub
$ docker image

前提是用户有docker-hub的账号

  1. 提交远程仓库
$ docker push cristicmei/name:v1.0.0

精简Docker镜像大小的必要性

Docker镜像由很多镜像层(Layers)组成(最多127层),镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts)等技术,可以查看Docker社区文档以了解更多有关Docker存储驱动的内容,这里不再赘述。总的来说,Dockerfile中的每条指令都会创建一个镜像层,继而会增加整体镜像的尺寸。

下面是精简Docker镜像尺寸的好处:

减少构建时间
减少磁盘使用量
减少下载时间
因为包含文件少,攻击面减小,提高了安全性
提高部署速度
  • 最重要的因素是减少镜像的层数,这样能大大减小镜像的大小;

使用链式代码“&&”把多行指令结合成一行

  • 清除 yum 缓存
$ yum clean headers
$ yum clean packages
$ yum clean all
  • 清除无用的tar.gz安装包
  • 选择更小的基础镜像

ISSUE

/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录

1.命令查看磁盘使用情况

$ du -hs /var/lib/docker/ 

用于查看Docker的磁盘使用情况

$ docker system df

  1. 清理磁盘
$ docker system prune 

可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。

$ docker system prune -a
  1. 迁移 /var/lib/docker 目录

关于转载 江南一点雨 一键部署 docker江南一点雨 博客项目的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署、Centos7一键部署Docker脚本、Docker Compose 一键部署 LNMP、Docker 脚本化一键部署等相关知识的信息别忘了在本站进行查找喔。

本文标签: