提示:本博客在持续更新
参考资料:
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 stop
和 docker 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"]
参考文献: