安装配置docker私有仓库

局域网私有仓库

如上,搭建一个只有本机访问的私有镜像非常简单,不用对已有的docker服务进行任何配置。如果要搭建一个能在局域网内访问的docker仓库,就需要对docker服务进行一些简单的配置。

首先,在主机A上:

1. 安装registry镜像(同上)

拉取registry镜像:

docker pull registry

Using default tag: latest 
latest: Pulling from library/registry709515475419: 
Pull completedf6e278d8f96: 
Pull complete4b0b08c1b8f7: 
Pull complete80119f43a01e: 
Pull completeacf34ba23c50: 
Pull completeDigest:

sha256:412e3b6494f623a9f03f7f9f8b8118844deaecfea19e3a5f1ce54eed4f400296Status: Downloaded newer

imageforregistry:latest

启动registry镜像

docker run-d-p 5000:5000 --restart=always --name registry  -v

/your/path/to/registry-images:/var/lib/registry  registry:latest

2. 将某个image导入registry,这里使用主机A的IP而不是localhost

docker tag jdeathe/centos-ssh:centos-7 192.168.0.111:5000/ssh:7

镜像推到仓库

docker push 192.168.0.111:5000/ssh:7

3.修改主机A的docker配置(/etc/sysconfig/docker文件不存在则直接创建)

other_args="--insecure-registry192.168.0.111:5000"

4.重启docker服务

service docker restart

在同一局域网中的另一台主机B上

4.1 修改docker配置(/etc/docker/daemon.json文件不存在则直接创建),使docker daemon能连上私有的registry

{

"registry-mirrors": ["192.168.0.111:5000"],

}

4.2 修改主机B的docker配置(/etc/sysconfig/docker文件不存在则直接创建)

other_args="--insecure-registry192.168.0.111:5000"

4.3 重启docker服务

service

docker restart

4.4 下载主机A中仓库的镜像,在局域网中速度非常快,以后开发过程中做部署测试就非常方便了。

docker pull 192.168.0.111:5000/ssh:7

CentOS6安装Docker

未分类

之前写过一篇关于在Mac上面使用并安装Docker的文章《Mac上Docker的安装和使用初探》,介绍了在Macos上面安装Docker的步骤。近期由于需要在一台CentOS 6.5的服务器上面部署一些服务,考虑到使用Docker来做这些事情,记录一下处理的步骤。

1、检查内核版本

uname -r

如果输出的信息为2.6.32-431.el6.centos.plus.x86_64,表示当前的内核版本是2.6.32。docker需要的内核版本是3.10,所以需要升级Linux的内核,升级的步骤如下:

(1) 导入public key

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

(2) 安装ELRepo

rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm

(3) 安装内核

yum --enablerepo=elrepo-kernel install kernel-lt -y

目前在ELRepo源中存在如下几个版本的内核,参考地址http://elrepo.org/linux/kernel/el6/x86_64/RPMS/,long-term表示长期稳定版本

  • 1) ml(main-line): 4.6

  • 2) lt(long-term): 3.10

(4) 修改Grub引导顺序

vim /etc/grub.conf
修改default=0

(5) 重启

shutdown -r now

2、安装Docker

(1) 更新yum包

sudo yum update

(2) 下载rmp包

curl -O -sSL https://get.docker.com/rpm/1.7.0/centos-6/RPMS/x86_64/docker-engine-1.7.0-1.el6.x86_64.rpm

(3) 安装rmp包

sudo yum localinstall --nogpgcheck docker-engine-1.7.0-1.el6.x86_64.rpm

(4) 启动docker服务

sudo service docker start

(5) 验证Docker

sudo docker run hello-world

如果安装启动成功,控制台输出的结果如下所示:

未分类

(6) 设置开机启动

sudo chkconfig docker on

如何卸载

yum list installed | grep docker
sudo yum -y remove docker-engine.x86_64 

使用Jenkins Ansible Docker Swarm实现自动化编译部署

自动化部署在项目部署过程中很重要,一旦自动化部署完成,我们就可以减轻我们手动的操作的步骤以及出错的概率。下面介绍一种通用的自动化部署。从打包编译到上线,一条命令就完成所有操作。简单而高效

1、Jenkins部署这里不在赘述,直接从新建项目开始。

项目截图,如下:增加两个变量如图,

  • BranchTobuild 默认是master分支,在编译的时候也可以指定分支。

  • PushDockerImage 默认布尔值是选中,直接把镜像推到镜像仓库。

未分类

增加Pipeline配置,主要是分了几个步骤。所以用pipeline,也可以不用这种方式,直接脚本也行

所有执行步骤写入Jenkinsfile中,并把文件放入项目的根目录,这样才能调用。

未分类

Jenkinsfile内容如下:包括编译、打包、推送docker镜像到仓库,ansible部署。

#cat Jenkinsfile
pipeline {

   //定义了执行jenkins的机器
    agent {
        label ‘master’
    }
    stages {
        stage (‘Prepare’) {
            steps {
                sh “echo Prepare”
                //准备阶段,没有暂不处理
            }
        }

        //build打包过程,最后会生产apk包
        stage (‘build’) {
            steps {
                sh ‘echo “start Build”‘
                script {
                    if (params.buildDebug) {
                        sh ‘echo “build debug version”‘
                        sh ‘chmod +x ./gradlew’
                        sh “./gradlew clean”
                        sh “./gradlew build –debug”
                    } else {
                        sh ‘echo “build release version”‘
                        sh ‘chmod +x ./gradlew’
                        sh “./gradlew clean”
                        sh “./gradlew build”
                    }
                }
            }
        }
        stage (‘Test’) {
            steps {
                sh “echo Test”
                //测试阶段,没有暂不处理
            }
        }

       //发布阶段,项目中包括了gradle.properties文件,几个变量:版本、项目、产品,按照这几个名词生产镜像的名
        stage (‘Deploy’) {
            steps {
                sh ‘echo “Start Docker Build And Push Images”‘
                script {
                    if (params.PushDockerImage) {
                        def props = readProperties  file: ‘gradle.properties’
                                    def VERSION = props[‘version’]
                                    def PRODUCT = props[‘product’]
                                    def ARTIFACT = props[‘artifact’]
                        sh ‘echo “start Build”‘
                                    //开始修改Dockerfile
                                    sh “sed -i ‘s#${PRODUCT}#${PRODUCT}#g’ Dockerfile”
                                    sh “sed -i ‘s#${VERSION}#${VERSION}#g’ Dockerfile”
                                    sh “sed -i ‘s#${ARTIFACT}#${ARTIFACT}#g’ Dockerfile”
                        sh “docker build -t registry.sreop.com:5000/${PRODUCT}/${ARTIFACT}:${VERSION} -f Dockerfile .”
                        sh ‘echo “Publish Images To registry.leautolink.com”‘
                        sh “docker push registry.leautolink.com:5000/${PRODUCT}/${ARTIFACT}:${VERSION}”

                        //ansible playbook 部署到线上或者测试环境
                        sh “sudo /usr/bin/ansible-playbook  /data/base-docker-compose/product/light/prod/playbook.yml”
                    }
                }
            }
        }
    }
}

2、每个项目需要一个Dockefile

cat Dockerfile
# 基础镜像
FROM registry.sreop.com:5000/alpine-java:8u121b13_jdk_unlimited
# 维护者信息
MAINTAINER [email protected]
# 镜像操作命令
RUN mkdir -p /data/bin/${PRODUCT}/${ARTIFACT}
# 指定后续命令的执行目录
WORKDIR /data/bin/${PRODUCT}/${ARTIFACT}
# 对外连接端口号
EXPOSE 12429
# 向镜像中增加文件
ADD ./build/libs/${ARTIFACT}-${VERSION}.jar .
# 容器启动命令
CMD java -Djava.security.egd=file:/dev/./urandom -jar ${ARTIFACT}-${VERSION}.jar –spring.profiles.active=prod

3、写ansible playbook,为推送到Docker集群平台,并部署到线上或者测试平台。

注意:docker-compose.yml要拷贝到每个docker节点机器上。功能是:获取各个变量,拉取镜像。最后生产docker services

– name: light Pull Image
  hosts: docker-swarm-prod
  remote_user: root
  tasks:
    – name: get product var 
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml |head -n1|awk -F’/’ ‘{print $2}’
      register: product
    – name: get artifact var
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#(.*):(.*)#1#g’
      register: artifact
    – name: get version var
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#(.*):(.*)#2#g’
      register: version
    – name: docker pull image
      shell: docker pull registry.leautolink.com:5000/”{{ product.stdout }}”/”{{ artifact.stdout }}”:”{{ version.stdout }}” || /bin/true

– name: Remove Docker Old Verison
  hosts: docker-swarm-prod-lead 
  remote_user: root
  tasks:
    – name: get product var
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1|awk -F’/’ ‘{print $2}’
      register: product
    – name: get artifact var
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#(.*):(.*)#1#g’
      register: artifact
    – name: get version var
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#(.*):(.*)#2#g’
      register: version
    – name: remove light
      shell: docker stack rm {{ artifact.stdout }} || /bin/true

– name: Start New verison
  hosts: docker-swarm-prod-lead 
  remote_user: root
  tasks:
    – name: get product var
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1|awk -F’/’ ‘{print $2}’
      register: product
    – name: get artifact var
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#(.*):(.*)#1#g’
      register: artifact
    – name: get version var
      shell: grep image /data/base-docker-compose/product/light/prod/docker-compose.yml|head -n1 |awk -F’/’ ‘{print $3}’|sed ‘s#(.*):(.*)#2#g’
      register: version
    – name: start light
      shell: docker stack deploy -c /data/base-docker-compose/product/light/prod/docker-compose.yml {{ artifact.stdout }} || /bin/true 

4、swarm集群部署compose.yml

# cat docker-compose.yml 
version: “3”
services:
  config-server:
    image: registry.sreop.com:5000/leradio/light:1.0.1-RELEASE
    command: java -Djava.security.egd=file:/dev/./urandom -jar light-1.0.1-RELEASE.jar –spring.cloud.config.profile=prod –spring.profiles.active=prod
    ports:
      – 12429:12429
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
networks:
  frontend:

docker安装部署gitlab 配置使用部外nginx

一、docker安装gitlab镜像

1,镜像信息

https://hub.docker.com/r/gitlab/gitlab-ce/

docker pull gitlab/gitlab-ce

2,启动镜像

sudo docker run --detach 
 --hostname git.tmy.com 
 --publish 8929:80 --publish 2289:22 
 --name gitlab 
 --restart always 
 --volume /data/gitlab/config:/etc/gitlab 
 --volume /data/gitlab/logs:/var/log/gitlab 
 --volume /data/gitlab/data:/var/opt/gitlab 
 gitlab/gitlab-ce:latest

文档地址:https://docs.gitlab.com/omnibus/docker/#run-the-image

3,访问本机安装的gitlab

127.0.0.1:8929 端口号为步骤2中设置的端口号。

此处不知何种原因,启动了需要等待几分钟才可以访问,知道的大神可以六个言交流下。

可以访问之后继续往下走。

二、配置使用外部的nginx服务器

1,关闭gitlab内部的nginx服务

官方文档地址:https://docs.gitlab.com/omnibus/settings/nginx.html#using-a-non-bundled-web-server

启动的时候映射出来的目录
vim /data/gitlab/config/gitlab.rb 

在配置文件最末尾加上配置
nginx['enable'] = false 
web_server['external_users'] = ['www-data']

使配置生效
docker exec gitlab gitlab-ctl reconfigure

2,配置本机上的nginx

新nginx虚拟机配置文件,我的虚拟机配置文件在/usr/local/nginx/conf/vhost

vim /usr/local/nginx/conf/vhost/git.tmy.com.conf

下载官方的配置文件

https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/nginx

配置文件有http 和 https两个版本,这里我选择了http第一个

## GitLab 8.3+
##
## Lines starting with two hashes (##) are comments with information.
## Lines starting with one hash (#) are configuration parameters that can be uncommented.
##
##################################
## CONTRIBUTING ##
##################################
##
## If you change this file in a Merge Request, please also create
## a Merge Request on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests
##
###################################
## configuration ##
###################################
##
## See installation.md#using-https for additional HTTPS configuration details.

upstream gitlab-workhorse {
 server unix:/var/opt/gitlab/gitlab-workhorse/socket;
}

## Normal HTTP host
server {
 ## Either remove "default_server" from the listen line below,
 ## or delete the /etc/nginx/sites-enabled/default file. This will cause gitlab
 ## to be served if you visit any address that your server responds to, eg.
 ## the ip address of the server (http://x.x.x.x/)n 0.0.0.0:80 default_server;
 listen 0.0.0.0:80 default_server;
 listen [::]:80 default_server;
 server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com
 server_tokens off; ## Don't show the nginx version number, a security best practice
 root /opt/gitlab/embedded/service/gitlab-rails/public;

 ## See app/controllers/application_controller.rb for headers set

 ## Individual nginx logs for this GitLab vhost
 access_log /var/log/nginx/gitlab_access.log;
 error_log /var/log/nginx/gitlab_error.log;

 location / {
 client_max_body_size 0;
 gzip off;

 ## https://github.com/gitlabhq/gitlabhq/issues/694
 ## Some requests take more than 30 seconds.
 proxy_read_timeout 300;
 proxy_connect_timeout 300;
 proxy_redirect off;

 proxy_http_version 1.1;

 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;

 proxy_pass http://gitlab-workhorse;
 }
}

将配置文件写入刚才创建的虚拟机文件配置文件中。修改

#找到
upstream gitlab-workhorse {
 server unix:/var/opt/gitlab/gitlab-workhorse/socket;
}
#修改为
upstream gitlab-workhorse {
 server unix:/data/gitlab/data/gitlab-workhorse/socket;
}
#找到
server_name YOUR_SERVER_FQDN;
#修改为
server_name git.tmy.com 【域名是你自己配置好的域名】
#找到
access_log /var/log/nginx/gitlab_access.log;
error_log /var/log/nginx/gitlab_error.log;
#改为
access_log /data/wwwlogs/gitlab_access.log;
error_log/data/wwwlogs/gitlab_error.log;
#上边是日志文件而已,改称你自己的就行

配置完成后检查nginx -t 是否正常,没问题重新载入配置即可。

三、修改目录权限

chown -R www:www /data/gitlab/data/gitlab-workhorse/

修改完成后访问git.tmy.com 即可进入gitlab的web界面了

docker部署zabbix监控系统(nginx mysql)

本次使用docker搭建zabbix的组合是mysql+docker+zabix-server

1. 先安装数据库mysql

docker run --name zabbix-mysql-server --hostname zabbix-mysql-server 
-e MYSQL_ROOT_PASSWORD="123456" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_DATABASE="zabbix" 
-p 3306:3306  
-d 
mysql

2. 创建zabbix-server

docker run  --name zabbix-server-mysql --hostname zabbix-server-mysql 
--link zabbix-mysql-server:mysql 
-e DB_SERVER_HOST="mysql" 
-e MYSQL_USER="zabbix" 
-e MYSQL_DATABASE="zabbix" 
-e MYSQL_PASSWORD="123456" 
-v /etc/localtime:/etc/localtime:ro 
-v /data/docker/zabbix/alertscripts:/usr/lib/zabbix/alertscripts 
-v /data/docker/zabbix/externalscripts:/usr/lib/zabbix/externalscripts 
-p 10051:10051 
-d 
zabbix/zabbix-server-mysql

3. 最后web-nginx

最后安装zabbix-web-nginx
docker run --name zabbix-web-nginx-mysql --hostname zabbix-web-nginx-mysql 
--link zabbix-mysql-server:mysql 
--link zabbix-server-mysql:zabbix-server 
-e DB_SERVER_HOST="mysql" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_DATABASE="zabbix" 
-e ZBX_SERVER_HOST="zabbix-server" 
-e PHP_TZ="Asia/Shanghai" 
-p 8000:80 
-p 8443:443 
-d 
zabbix/zabbix-web-nginx-mysql

登录访问测试

浏览器访问ip:8000查看
默认登录
username:Admin
password:zabbix

这里说明下,mysql没做数据卷的映射,nginx也没做数据卷的映射,在实际生产环境下,最好做数据映射。防止数据丢失。

docker-zabbbix-agent的安装以及链接zabbix-server

docker run --name zabbix-agent --link zabbix-server-mysql:zabbix-server -d zabbix/zabbix-agent:latest

最后需要在web端将,zabbix-agent添加到zabbix-server的host列表里面。

监控

使用docker-compose来部署WordPress

很早的时候想维护一个个人Blog,一开始通过 github home page + jekyll,奈何没精力再去把ruby玩溜,自己也不是个擅长改写前端页面的人,无疾而终。今天终于鼓起勇气,买了服务器和域名,部署了wordpress,毕竟wordpress易用易上手,模板也多,也就懒得自己改了。既然本Blog是运行在Docker之上的,那第一篇文章也就来说说这个吧。

部署方式介绍

  • 我的服务器安装的是Arch Linux,自己也是比较喜欢这个极简的Linux发行版。
  • 我使用了docker-compose来做镜像编排工具,nginx,mysql(mairadb),wordpress分别运行于不同的容器。
  • 托上面两个先决条件的福,下面的内容大家根据自己的实际环境,酌情选择。

准备工作

安装Docker

托Arch Linux的福,安装Docker非常简单。

pacman -S docker

安装docker-compose

同样是托Arch的福,安装依旧简单粗暴。

pacman -S docker-compose

准备配置

首先我们需要做的是准备好docker wordpress运行的用户,执行以下命令,添加一个叫wordpress的新用户,将它添加到docker用户组,并为它设置密码

useradd -m -s /bin/zsh wordpress
usermod -a -G docker wordpress
passwd wordpress

紧接着,创建一些目录,保存docker-compose配置文件,存储运行产生的文件,让数据库落地到本机而不是容器,执行以下命令

su - wordpress
cd
mkdir wordpress-compose
touch docker-compose.yml
mkdir -p wordpress-compose/db-data
mkdir -p wordpress-compose/logs/nginx
mkdir -p wordpress-compose/nginx
mkdir -p wordpress-compose/wordpress

这些目录和文件的功能分别如下:

目录或文件 含义

  • wordpress-compose 容器相关根目录
  • wordpress-compose/db-data 数据库数据存储目录
  • wordpress-compose/logs/nginx nginx存储目录
  • wordpress-compose/nginx nginx配置文件
  • wordpress-compose/wordpress wordpress本体,因为安装插件等会改变php文件

接下来我们编写必要的nginx配置文件。在wordpress-compose/nginx下新建wordpress.conf文件,文件中写入下面这些配置,一个很经典的php-fpm的nginx配置文件。

server {
    listen 80;
    server_name www.gsgtzq.com;

    root /var/www/html;
    index index.php;

    access_log /var/log/nginx/wordpress-access.log;
    error_log /var/log/nginx/wordpress-error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

接下来就是docker-compose配置文件的编写了,首先将工作目录切换至刚刚创建的wordpress-compose目录,用自己熟悉的编辑器打开docker-compose.yml文件。

vim docker-compose.yml

先是nginx部分,我使用最新的nginx镜像,暴露80端口给本机,挂载conf.d、log、/var/www/html目录到本机,连接nginx和wordpress容器。

nginx:
        image: nginx:latest
        ports:
                - '80:80'
        volumes:
                - ./nginx:/etc/nginx/conf.d
                - ./logs/nginx:/var/log/nginx
                - ./wordpress:/var/www/html
        links:
                - wordpress
        restart: always

然后是mysql部分,我使用了mairadb的最新镜像,挂载mysql数据存储点到本机,链接mysql和wordpress容器,通过环境变量设置mysql的默认root密码。

mysql:
        image: mariadb:latest
        volumes:
                - ./db-data:/var/lib/mysql
        environment:
                - MYSQL_ROOT_PASSWORD=123345
        restart: always

最后是wordpress本体,我使用wordpress:php7.1-fpm的镜像,挂载/var/www/html目录到本机,链接连接mysql容器和wordpress,并且使用环境变量,指定mysql主机名,表前缀,和库名。

wordpress:
        image: wordpress:php7.1-fpm
        volumes:
                - ./wordpress:/var/www/html
        environment:
                - WORDPRESS_DB_NAME=wpdb
                - WORDPRESS_TABLE_PREFIX=wp_
                - WORDPRESS_DB_HOST=mysql
        links:
                - mysql
        restart: always

到此位置,docker-compose的配置文件全部编写完毕。

启动容器

编排文件已写完,接下来启动容器即可。

docker-compose up -d

当收到三个done以后,编排好的容器就正式启动了,我们现在可以访问本机的IP或域名来访问wordpress了。
我还可以使用下面这些命令来检查容器的运行情况,注意,docker-compose命令只有在刚才写好配置文件的目录下执行才有效果。

命令 含义

  • docker ps -a 查看当前所有运行的docker容器
  • docker-compose logs wordpress 查看wordpress容器的日志
  • docker-compose ps 查看当前编排好的应用的所有容器状态
  • docker-compose top 查看当前编排好的应用中各容器中的进程情况

具体还有一些其他的办法,可以通过查阅docker手册和docker-compose文档来进行使用。

结束语

到此为止,使用docker来运行wordpress已经完成,从开始折腾Docker到现在少说1个半月过去了,也是学习到了非常多的东西,目前而言公司的项目想用起docker来还是有不少难度,我思考了很多使用docker对传统部署和开发带来冲击的问题,例如对开发人员的要求其实高了很多,尤其是在运维这块,基础环境部署等等……但很希望自己能把它用好了,开发受益,运维也受益。

Ubuntu 16.04使用Docker部署WordPress

未分类

介绍

WordPress是基于PHP和MySQL的著名内容管理系统,根据GNU GPLv2(或更高版本)的规定分发。通常它安装在像Apache这样的Web服务器上,但也可以在使用Docker容器构建的隔离环境中运行它,特别是使用Docker Compose。本教程的主题时使用Ubuntu 16.04作为操作系统。

入门

首先,有必要安装Docker和Docker Compose。 在Ubuntu 16.04中,这可以通过两种不同的方式完成:

  • 设置存储库并从中安装,方便安装和升级任务
  • 下载DEB包并手动安装; 还允许您完全手动管理升级

在本教程中,Docker将使用存储库方法进行安装。 因此,您需要安装软件包以允许apt通过HTTPS使用存储库:

# apt install -y --no-install-recommends apt-transport-https ca-certificates curl software-properties-common

接下来,添加Docker的官方GPG密钥:

$ curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -

密钥ID应为58118E89F3A912897C070ADBF76221572C52609D,因此验证:

$ apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

使用以下命令设置稳定存储库:

# add-apt-repository 
       "deb https://apt.dockerproject.org/repo/ 
       ubuntu-$(lsb_release -cs) 
       main"

现在可以安装Docker了。

首先,更新apt包索引:

# apt update

然后:

# apt install docker-engine
This will install docker and its daemon should start automatically.

安装 Docker Compose

安装Docker后,下一步是安装Compose,这是此过程所必需的。 只需执行命令:

# curl -L https://github.com/docker/compose/releases/download/1.11.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

更改docker-compose binary的权限:

# chmod +x /usr/local/bin/docker-compose

测试:

$ docker-compose --version

现在Docker和Docker Compose已安装并可以使用。

安装 MariaDB

创建一个空目录,例如docker_wordpress。
然后改成:

$ cd docker_wordpress

创建一个docker-compose.yml文件,该文件将启动您的WordPress博客和一个单独的MySQL实例与卷挂载数据持久性。
在此文件中,输入以下文本:

version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

接下来,在docker_wordpress文件夹中,使用以下命令启动容器:

# docker-compose up -d

这很简单,因为Docker团队确保一切都配置良好。 事实上,WordPress Docker容器中有一个脚本,它从wordpress容器中读取MYSQL_ROOT_PASSWORD变量,并使用它来连接到WordPress。

安装 PHPMyAdmin

添加PHPMyAdmin与添加数据库没有什么不同。在docker-compose.yml文件中,只需在“services”部分添加以下行:

phpmyadmin:
image: corbinu/docker-phpmyadmin
  links:
    - wordpress_db:mysql
  ports:
    - 8181:80
  environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: wordpress

保存这些配置并运行docker-compose命令来创建和启动容器:

# docker-compose up -d

配置几乎完成! 使用Web浏览器,转到URL:http://SERVER_IP:8181。 它将显示PhpMyAdmin的登录屏幕。 使用在docker-compose.yml文件中配置的相同凭据进行登录。

总结

就这样!现在服务器正在运行WordPress安全和隔离的容器。虽然Docker是“开发人员工具”,但它可以用于各种项目,就像这里所示。 当然,配置文件可以通过更细致的细节进行编辑和定制,例如DNS部分和一些硬件限制,如CPU和内存使用。 祝你玩得开心!

docker运行golang应用

搭建 mysql 环境

mysql.app

docker run --net=host -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=letchat -d  hub.c.163.com/library/mysql:latest

1. 通过容器编译并运行当前目录下的 golang程序(依赖需要先下载到当前目录 vendor中)

gobuild.app

docker run --net=bridge --rm -v $PWD:/go/src/app -w /go/src/app hub.c.163.com/library/golang:latest  go build -v

2. 使用 Docker构建镜像,在此镜像上运行一个容器,使用该容器运行 golang程序

Dockerfile

FROM hub.c.163.com/library/golang:latest

WORKDIR /go/src/app
COPY . .

#RUN go-wrapper download   # "go get -d -v ./..."
RUN go-wrapper install    # "go install -v ./..."

CMD ["sh","-c","/go/bin/app"]

gorun.app

# build image  app
docker build -t app:latest .

# set env
export GIN_MODE=release

# make the container
docker run --net=host -it -d app:latest

2 种方式选1个。第一个是直接在本地生成一个 app 程序,可以直接 ./app 运行。第二个是在容器内部运行 app程序,但是网络端口使用宿主机的端口,相当于直接在本机上运行。

docker部署node应用

环境:centos7

docker的安装以及一些设置

安装docker

     yum install docker

启动docker服务

     systemctl start docker.service

设置开机启动

     systemctl enable docker.service

pull下nodejs镜像

说是docker hub 慢,就找到了一个国内的镜像去下载

     docker pull hub.c.163.com/nce2/nodejs:0.12.2

未分类

查看镜像

     docker images

未分类

创建node应用

然后在工作目录下创建package.json文件

     vi package.json

写入内容
未分类

创建server.js,也就是我们node应用的主文件

     vi server.js

写点内容
未分类

创建Dockerfile文件

在项目代码更目录创建Dockerfile文件

     vi Dockerfile

写入以下内容
未分类
下面简单解释下Dockerfile文件

FROM hub.c.163.com/nce2/nodejs:0.12.2

FROM是构建镜像的基础镜像源,后面的一串是我们刚才pull下来的那个Image,如果本地没有Docker,会自己pull镜像的。

#Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service

第一句RUN用于在Image里创建一个文件夹,将会用于保存我们的代码。
第二句WORKDIR是将我们创建的文件夹作为工作目录。

# Bundle app Source
COPY . /home/Service
RUN npm install

第一句的COPY是把本机当前目录下的所有文件拷贝到Image的 /home/Service目录下。
第二句的RUN是用npm 安装我们的node应用中的所有依赖包。

EXPOSE 8888

我们的node应用监听的是8888端口,我们可以把这个端口暴露给主机。这样我们就可以从外网访问我们的应用了。

CMD ["npm" , "start"]

用来启动我们的node应用。

构建Image

在我们的Dockerfile所在的目录下执行构建命令

docker build -t mynodeapp .

别忘了最后那个点,不久我们会看到成功构建的信息。
未分类

然后我们去查看一下我们构建的镜像

docker images

未分类

运行构建的Image

docker run -d -p 8888:8888 50550c

-d表示容器会在后台运行,-p表示端口映射,把本机的8888端口映射到container的8888端口,这样外网就可以通过本机访问我们的应用,
后面的50550c是我们Image的ID,没写后面的是因为根据这几个就能定位出来了。

竟然报错了,也不能访问8888端口。想了一下,应该是镜像的问题。
就跑去dochub找了官方镜像,修改Dockerfile里的基础镜像

FROM node:4-onbuild

然后再次构建我们的应用

docker build -t nodeapp .

然后开始从官网下载镜像,确实特别慢..等了好久才下载完1个。貌似需要下载9个文件..
在漫长的等待过程中。。。
未分类

算了,放弃。。找找国内镜像试试吧~~

然后去daocloud注册了帐号,在这拉镜像吧

未分类
很快,镜像pull下来了。然后查看下现在的镜像。

未分类
现在我们去改下Dockerfile的基础镜像吧。

FROM daocloud.io/library/node

现在我们再来构建下镜像试试

docker build -t nodeapp .

看到了构建成功的信息,接着查看一下imges

然后启动:

docker run -d -p 8888:8888 7b784

果然出现了问题… 启动不成功,最后才知道,镜像和Dockerfile都是对应的,不对应就可能会出现上面的所有问题。(切记)

最近还是选择了官网的镜像,等待了40分钟左右,全部pull下来了,开始干活~~

修改Dockerfile文件如下:

FROM node:4-onbuild
# replace this with your application's default port
EXPOSE 8888

重新构建:

docker build -t my-node-apps .

未分类

启动docker镜像:

docker run -d -p 8888:8888 8b

然后查看下container

docker ps

未分类

然后用浏览器访问下8888端口:

未分类
完美!!!!!!!!!这次终于成功了~

然后去删除没用的images和container…

若要删除所有的image, 使用命令:

docker rmi  $( docker  images -q )

删除container

docker rm id

总结

因为镜像的事情走了不少弯路,浪费了很多的时间,所以最好还是去官网下需要的东西,然后看官方给的文档,英文的也要尽力去看。
今后还要去做学习一些images的管理,container的管理,以及应用日志处理相关的东西。

docker-compose快速搭建python开发环境

Docker提供了容器级别的资源隔离。由于Python的外部依赖管理中存在的问题,我们通常会使用virtualenv来对不同的项目创建其唯一的依赖环境。这时利用Docker进行Python开发,可以轻松解决不同Python项目之间的依赖隔离问题。

作为应用程序,我们通常需要依赖于多种外部服务,比如数据库、缓存服务等等。Docker-compose就是在Docker容器的基础上,提供了统一的容器编排语言,可以让你更轻松的利用Docker构建你的应用环境。

编写Dockerfile

我们使用requirements.txt定义我们的第三方python包依赖
Python
Project-Root
|– static
|– templates
|– server.py
|– requirements.txt
|– Dockerfile
|– docker-compose.yml

编写Dockerfile内容如下:
Python
在Dockerfile中,我们主要目的:通过requirements.txt文件安装第三方的Python库依赖;利用Docker的容器隔离,可以忽略掉很多在本地开发中需要使用的东西,比如virtualenv。

编排我们的Docker容器

在案例中,应用程序依赖了mongodb作为数据存储服务,以及redis作为缓存服务。在一般情况下,作为开发团队要么我们搭建统一的mongodb;要不就每个人在开发机上单独部署。

而在Docker中,我们则不在需要做这么多无用的事情。 Docker官方提供了大量的基础容器,基本涵盖了日常开发中我们需要的大部分依赖。 在https://hub.docker.com/我们可以搜索到我们需要的基础镜像。

比如mongodb以及redis,在docker-hub上官方都提供了容器话的服务。

以redis容器为例,我们在本地搭建redis服务要做的事情主要包括两步:
Python
这个时候我们就可以通过访问0.0.0.0:63775来访问我们的redis服务器了。

我们也可以通过Docker原生的命令来连接我们的应用容器和redis容器,以使我们的代码能够正常的访问redis服务
Python
而事实上,我们可以使用更加简化的方式来定义我们的容器组合管理,使用Docker-compose(前身Fig)来定义我们的容器组合关系。
Python
这里我们定义了3个容器web、redis、mongo。 其中,web容器是通过当前目录的Dockerfile进行构建,同时将当前目录挂在到/app目录。 而redis和mongo则直接使用官方进行。

通过使用links,我们可以在web容器中通过 ‘redis:6375’以及’mongo:21707’直接访问相应的服务。

开始Coding吧

Python
Docker会根据当前的目录下得Dockerfile构建基础镜像,并且使用python server.py运行程序,并且运行redis以及mongo服务。

同时由于使用了volumes挂载了本地目录到/app,此时如果我们是开启的Debug模式,我们就可以直接在本地使用你喜欢的文本编辑器去编写代码,并且更新的代码能够实时被重新加载。

当然在使用Docker中最漫长的过程就是,下镜像,下镜像&下镜像。
Python