Docker入门

提示:本博客在持续更新

参考资料:

入门,第 2 部分:容器


麦子学院Docker教程


docker中文 docker手册 docker教程


Docker中文指南


docker官方镜像加速器

1、安装

sudo yum install docker
docker -v  #打印Docker版本号
sudo chkconfig docker on  #将Docker设置为开机自启动
sudo service docker start #启动Docker

我的环境是CentOS 7,不同的操作系统安装方法不一样

当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则,从而影响了 Docker 的正常工作。

当你使用的是 Systemd 的时候, firewalld 会在 Docker 之前启动,但是如果你在 Docker 启动之后再启动 或者重启firewalld ,你就需要重启 Docker 进程了。

配置镜像加速

由于N多因素造成国内下载镜像会相当慢,Docker官方推出镜像加速器,我们可以根据自己的场景进行不同方式的加速配置。

官方文档: docker官方镜像加速器

永久生效的镜像加速

我们需要在docker守护进程的配置文件中添加docker加速仓库地址。

sudo vi /etc/docker/daemon.json

内容如下:

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

重启docker守护进程,使得加速地址生效:

sudo service docker restart

本次启动生效的镜像加速

本次下载生效的镜像加速

如果我们只是在当前的镜像下载中需要加速,可以选择这种方式:

$ docker pull registry.docker-cn.com/library/ubuntu:16.04

registry.docker-cn.com/library/ubuntu 是完整的镜像名称,:16.04是版本。

下载镜像

官方镜像的完整名称是用户名/镜像名,如果制定版本就用用户名/镜像名:版本

提示:有一组比较特殊的镜像,比如ubuntu这类基础镜像,经过官方的验证,值得信任,可以直接用镜像名来检索到。

$ docker pull registry.docker-cn.com/library/mysql

容器的状态

docker 容器的常见状态有三种: created、up、 paused、exited
这里写图片描述

在docker的四个状态中,只有up才是正常运行的。

启动容器并运行

docker run -d -p 80:80  --name mynginx  

容器常用操作命令

这里写图片描述

docker stopdocker kill 都可以停止容器的运行,但一个docker stop是正常停止,docker kill是快速停止。

docker create  --name app  nginx    #生成容器

docker start app  #启动

docker stop app #停止容器

docker kill app #快速停止容器

docker pause app  #停止容器内部的进程

docker unpause app  #唤醒容器内部的进程

制作镜像

镜像已经是软件交付的常规手段,镜像包含了“运行环境+程序+数据”的完整组合,我们可以将软件打包成镜像然后交付到客户手中。

那么,如果制作镜像呢?

方法一 、Dockerfile

使用Dockerfile制作镜像是首种选择方式,根据Dockerfile,可以build出镜像,因此,我们可以通过Dockerfile生成多个相同的软件,搭建一致的开发、测试、生产环境就是一个典型的例子。

这里写图片描述

PHP应用程序镜像Demo

我们这里举个栗子,看一下如果通过Dockerfile制作软件镜像,项目结构如下:

|
|-- php
    |-- Dockerfile
    `-- index.php

Dockerfile

# 从官方PHP镜像构建
FROM       php

# 将index.php复制到容器内的/var/www目录下
ADD        index.php /var/www/

# 容器对外暴露8080端口
EXPOSE     8080

# 设置容器默认工作目录为/var/www
WORKDIR    /var/www/

# 容器运行后默认执行的指令
ENTRYPOINT ["php", "-S", "0.0.0.0:8080"]

index.php

<?php
echo "在容器中运行PHP";

到这里,一个最简单的PHP项目的docker构建工作已经完成了,我们的项目只有一个文件,就是入口程序index.php,通过docker构建文件Dockerfile我们开始构建出来软件的镜像。

docker build -t iamcer/php-hello ./php/

这里写图片描述

现在我们可以在镜像列表中看到刚构建出来的镜像iamcer/php-hello了。

保存和使用镜像

接下来,我们就可以将镜像上传到docker hub或者其他地方保存,或者直接交给客户,只要客户端服务器上支持docker,就可以运行我们的软件镜像来提供服务。

# docker run -d  -p 80:8080 iamcer/php-hello

这里写图片描述

crul也可以看到结果:

# curl localhost
在容器中运行PHP

方法二 、 docker commit

利用docker commit命令,可以将容器容器保存成镜像

一个典型的应用是我们可以使用docker commit对容器快照成镜像来备份,这种方式的备份和腾讯云、阿里云快照整个操作系统的方式很像(或许是一样的),当灾难发生,我们可以通过镜像重启容器,具体请参考:Docker中容器的备份、恢复和迁移

下面我们来看看docker commit的使用。

制作带有tree命令的,基于centos的镜像demo/tree

我的centos镜像原本是没有tree命令的,下面我们就通过

# docker run -i -t --name tree   centos   #centos镜像启动一个容器
# yum update -y && yum install tree -y   #更新

完了之后,我们按下CTRL+D退出容器,现在我们可以看到容器。

#查看容器ID和名称

docker ps  -a

这里写图片描述

#生成镜像:

docker commit tree  demo/tree    #可以使用名称tree,也可以只用ID,demo/tree是生成的镜像

这里写图片描述

上传镜像到镜像仓库

为了在其他的机器上运行我们的项目,我们需要将准备好的镜像放到镜像仓库,以便新人入职可以从那里pull镜像。

Docker的仓库是docker hub,但是一般来说国内的镜像仓库更受欢迎,阿里云的docker仓库,是一个不错的选择。

各大公司的镜像仓库都是相似的。

这里写图片描述

这里写图片描述

记得,私有的仓库一般人是不能搜索到的,有授权,如果是开源的,请选择公有。
同样的道理,私有项目因为不可见,因此需要登录后才能docker pull。

登录阿里云docker registry:

$ sudo docker login --username=你的阿里云账户名 registry.cn-hangzhou.aliyuncs.com

从registry中拉取镜像:

$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/haijuwang/test:[镜像版本号]

注意:如果是私有镜像,那么在pull之前一定要先登录!!!!

将镜像推送到registry:

$ sudo docker login --username=你的阿里云账户名 registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/haijuwang/仓库名:[镜像版本号]  
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/haijuwang/仓库:[镜像版本号]

docker tag 作用是给镜像打标签,实际上是在本地复制一个镜像,然后重命名成tab只能的名字和版本号。

docker-compose

step1、安装pip
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
step2、安装docker-compose
$ sudo pip install docker-compose
$ docker-compose --version

docker构建lamp环境

lamp环境搭建推荐使用多容器方式,也就是每个容器一个服务,PHP、nginx、mysql分开。

多容器服务我们需要用到docker-compose

mysql

MySQL继承自官方的MySQL5.6镜像,Dockerfile仅有一行,无需做任何额外处理,因为普通需求官方都已经在镜像中实现了,因此Dockerfile的内容为:

FROM mysql:5.6

在项目根目录下运行

docker run -p 3306:3306 -v ~/opt/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it iamcer/mysql

我们可以在其他终端看是否连接得上:

mysql -h mysql主机名IP  -P 3306 -u root -p

nginx

注意:
Nginx目录下提前准备了Nginx配置文件nginx.conf以及项目的配置文件default.conf等。

Dockerfile内容为:

FROM nginx:1.9

#将写好的nginx主配置文件和站点配置文件移动到容器的中
ADD  nginx.conf      /etc/nginx/nginx.conf
ADD  sites-enabled/*    /etc/nginx/conf.d/

#创建网站根目录和日志目录,且在日志目录中创建nginx日志目录
RUN  mkdir /opt/htdocs && mkdir /opt/log && mkdir /opt/log/nginx

#修改网站根目录和网站日志目录的所有者
RUN  chown -R www-data.www-data /opt/htdocs /opt/log

VOLUME ["/opt"]

nginx.conf

#运行nginx的用户
user www-data;
worker_processes 1;

events {
        worker_connections 20240;
}

http {
        # NOTICE: sendfile MUST set to off under virtualbox env but virtual mount issue
        sendfile off;
        client_max_body_size 20m;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        # NOTICE: Dev only
        autoindex   on;

        include /etc/nginx/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" $host $request_time $upstream_response_time $scheme '
            '$cookie_evalogin';

        #日志文件
        #access_log /opt/log/nginx/access.log main;
        #error_log  /opt/log/nginx/error.log;

        gzip on;
        gzip_disable "msie6";
        gzip_comp_level 6;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        #引入其他的配置文件
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*.conf;
}

提示:
如果打开 access_log /opt/log/nginx/access.log main; 就必须提供~/opt/log/nginx目录,不然目录不存在nginx无法创建文件

此时网站根目录为:

.
|-- htdocs
|   |-- index.html
|   `-- index.php
`-- log
    `-- nginx
        |-- access.log
        `-- error.log

但是我们访问index.php会报错,因为nginx没找到php-fpm

PHP

准备好Nginx和MySQL,接下来就是把他们链接起来。

我们需要自己准备php.ini和php-fpm.conf来覆盖官方镜像默认的配置文件,这么做的目的是我们可以根据自己的需求改变php的配置。

FROM php:5.6-fpm

ADD php.ini    /usr/local/etc/php/php.ini
ADD php-fpm.conf    /usr/local/etc/php-fpm.conf

COPY redis.tgz /home/redis.tgz
RUN docker-php-ext-install gd \
    && docker-php-ext-install pdo_mysql \
    && pecl install /home/redis.tgz && echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini
ADD composer.phar /usr/local/bin/composer
RUN chmod 755 /usr/local/bin/composer

WORKDIR /opt
RUN usermod -u 1000 www-data

VOLUME ["/opt"]

参考文献:

Docker在PHP项目开发环境中的应用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值