docker基础实例

4-27 1,062 views

一、码云

有关https://gitee.com/

我们在git上注册一个账号,该网站有很多代码资料给你尽情download,同时你有好的代码亦可以上传上去。

通过git clone下载一个实例docker的文件包,以下实例通过此包实现,注意如果你没有安装docker,请查看上一篇文章先安装docker

#git clone https://gitee.com/ycy114/docker-training.git

二、构建centos7.1基础镜像

进入docker-training文件下,查看它的目录,可以看出有centos7、mysql 、php-fpm、wordpress几个基础docker包

cd docker-training/ && ls
centos7 mysql php-fpm README.md wordpress

首先我们先进入centos7文件夹,查看下它的Dockerfile文件

# cd centos7/ && vim Dockerfile

#
# MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>
# DOCKER-VERSION 1.6.2
#
# Dockerizing CentOS7: Dockerfile for building CentOS images
#
FROM centos:centos7.1.1503                                                                                          #通过父镜像centos7.1生成
MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com>                                         #该dockerfile制作人及邮箱地址

ENV TZ “Asia/Shanghai”                                                                                                 #ENV定义环境,可以定义多个环境
ENV TERM xterm

ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo                              #ADD是将本文件夹下面的阿里centos7镜像源拷贝到你要build的centos7.1镜像中去
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo

RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \        #RUN其实就是在你build的centos7.1镜像中执行一些shell
yum install -y gcc gcc-c++ git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && \
yum install -y –enablerepo=epel pwgen python-pip && \
yum clean all

RUN pip install supervisor
ADD supervisord.conf /etc/supervisord.conf

RUN mkdir -p /etc/supervisor.conf.d && \
mkdir -p /var/log/supervisor

EXPOSE 22                                                 #EXPOSE 是你build的镜像开放22端口给宿主机区连接

ENTRYPOINT [“/usr/bin/supervisord”, “-n”, “-c”, “/etc/supervisord.conf”]   #ENTRYPOINT最后一条生效,这里是开启supervisord服务!

下面我们开始build一个centos7.1基础镜像

#docker build -t csphere/centos:7.1 .      #-t参数是给镜像命名,冒号后面是版本id,如果没有写的话docker会加上latest标签 ,这个build可能会比较慢,和你的yum和网速有关。 后面.的意思是指明Dockerfile文件的位置,因为我就是在当前目录(Dockerfile所在目录)下执行的命令所以用.即可 ;若是相对路径则填写./xxxx/xxx/即可;若写绝对路径也是可以的如:/root/docker/docker-training/centos7

#docker images #查看你build的镜像

#docker run -d -p 2222:22 –name base csphere/centos:7.1  #根据镜像启动你build的容器,-d是后台启动 -p是固定宿主机的2222端口与镜像机ssh 22端口连接。

#docker ps -a #查看容器状态

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

47498d746ca3 csphere/centos:7.1 “/usr/bin/supervisor 3 hours ago Up 3 hours 0.0.0.0:2222->22/tcp base

显然centos:7.1 容器已经启动了

同样的切换到php-fpm文件夹下,建立php-fpm的build镜像,并根据镜像启动容器

#docker build -t csphere/php-fpm:5.4 .

#docker run -d -p 8080:80 –name website csphere/php-fpm:5.4  容器用本地的8080端口映射nginx的80端口

打开浏览器,输入 ip:8080/info.php 检查php容器是否正常生效

同样的切换到mysql文件夹下,建立mysql的build镜像,并根据镜像启动容器

#docker build -t csphere/mysql:5.5 .

#docker run -d -p 33306:3306 –name dbserver csphere/mysql:5.5

用navicat连接mysql的ip:33306,测试mysql容器是否有效。

删除已经在run运行状态下的容器

docker rm -f dbserver       #加上-f参数可以强制删除正在运行的build实例容器,为啥我要删除dbserver呢,原因很简单:数据库是数据是需要保留的,之前我们build这个dbserver容器时,没有加上-v参数(-v参数将容器某个目录下的数据映射到宿主机上)将/var/lib/mysql中数据映射到宿主机上。不然一旦容器出现问题,数据库数据也没了!

#docker stop dbserver #停止dbserver容器,其实也可以不用写容器名,写Container(容器)id也行,id写前几位就行,保持唯一即可!

#docker start dbserver #启动容器

# docker run -d -p 33306:3306 -v /var/lib/docker/vfs/dir/mysqldata:/var/lib/mysql –name dbserver csphere/mysql:5.5    #注意-v参数冒号前面是宿主机要保存容器数据的路径,后面是容器的数据路径,这样就做了一个数据映射。

#docker exec -it dbserver /bin/bash #进入dbserver容器的bash界面,这里也可以写容器id进入容器,如:# docker exec -it aa1 /bin/bash   #aa1是容器id的前3位

我们再次删除到dbserver这个容器

#docker stop dbserver

#docker rm dbserver

我们在切换到/var/lib/docker/vfs/dir/mysqldata ,可以看到dbserver容器虽然删除了,但是数据库数据还是存在的!

我们在新建一个newdbsever容器想用之前dbserver的MySQL留下的数据可以这么做:

#docker run -d -p 33306:3306 –name newdbserver -v /var/lib/docker/vfs/dir/mysqldata:/var/lib/mysql csphere/mysql:5.5

# docker exec -it newdbserver /bin/bash

#mysql

> show databases;                #查看之前建立的数据库确实存在,说明以后我们之后数据库数据做了映射的话,数据库容器

想删除就删除。不会有影响!

下面我们试试删除镜像

#docker rmi csphere/mysql:5.5

# docker rmi csphere/wordpress:4.2

 

同样的切换到wordpress文件夹下,建立wordpress的build镜像,并根据镜像启动容器

#docker build -t csphere/wordpress:4.2 /root/docker/docker-training/wordpress #我这写的是绝对路径

#docker run -d -p 80:80 –name wordpress -e WORDPRESS_DB_HOST=192.168.40.3 -e WORDPRESS_DB_USER=admin -e WORDPRESS_DB_PASSWORD=csphere2015 csphere/wordpress:4.2  #根据wordpress里我们需要传入3个参数ip 数据库用户 密码 -e是传递参数

但是发现过了十几秒wordpress这个容器挂掉了。通过# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
498ebb9d9cc7 csphere/wordpress:4.2 “/init.sh /usr/bin/s 16 minutes ago Exited (1) 10 minutes ago wordpress

处于exit(1)状态。我们可以通过#docker logs -f wordpress 查看wordpress容器日志 -f参数是查看实时日志的意思。

MySQL Connection Error: (1045) Access denied for user ‘admin’@’172.17.0.24’ (using password: YES)
PHP Warning: mysqli::mysqli(): (28000/1045): Access denied for user ‘admin’@’172.17.0.24’ (using password: YES) in – on line 7

可以看到这是链接不上数据库的报错,我们进去Mysql的容器newdbserver容器看看是否确实是这个问题

# docker exec -it newdbserver /bin/bash

# mysql -uadmin -pcsphere2015
ERROR 1045 (28000): Access denied for user ‘admin’@’localhost’ (using password: YES)

可以看到确实是数据库不让进!查看下数据库日志,centos7的数据库是mysql的分支mariadb,并未发现明显报错。

# cat /var/log/mariadb/mariadb.log

我这尝试手动修改下admin的密码为csphere2015

set password for ‘admin’=password(‘csphere2015’);

flush privileges;

mysql -uadmin -pcsphere2015
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

再次登录,可以正常登录访问了,下面我们再次启动wordpress容器

启动了报错还是一样。找到了最终原因!因为我创建mysql容器时用的是宿主机的33306映射的newdbserver的3306端口,所以我新建wordpress容器时应该加上端口号的,否则它默认是3306端口,这样就一直连接不上mysql数据库了

#docker run -d -p 80:80 –name wordpress -e WORDPRESS_DB_HOST=192.168.40.3:33306 -e WORDPRESS_DB_USER=admin -e WORDPRESS_DB_PASSWORD=csphere2015 csphere/wordpress:4.2

# docker ps  查看下 这次启动没问题了!

# docker logs -f wordpress  #查看实时日志  启动正常
2018-04-28 16:40:38,352 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message.
2018-04-28 16:40:38,352 INFO Included extra file “/etc/supervisor.conf.d/nginx.conf” during parsing
2018-04-28 16:40:38,352 INFO Included extra file “/etc/supervisor.conf.d/php-fpm.conf” during parsing
2018-04-28 16:40:38,380 INFO RPC interface ‘supervisor’ initialized
2018-04-28 16:40:38,381 CRIT Server ‘unix_http_server’ running without any HTTP authentication checking
2018-04-28 16:40:38,381 INFO supervisord started with pid 1
2018-04-28 16:40:39,386 INFO spawned: ‘nginx’ with pid 129
2018-04-28 16:40:39,400 INFO spawned: ‘php-fpm’ with pid 130
2018-04-28 16:40:40,793 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2018-04-28 16:40:40,796 INFO success: php-fpm entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

在浏览器中输入192.168.40.3即可打开的wordpress地址了

已经成功用docker建立了一个应用网站了。

 

 

 

 

 

 

 

 

 

 

 

Prometheus监控系统

前言:prometheus作为目前流行的一套监控系统,主要由三大件组成 prometheus(主监控服务)node_exporter(指标采集服务)Alertmanager(报警管理服务)Prome...

阅读全文

为Kubernetes v1.5.2版本安装dashboard图形界面

一、前言 dashboard是一个图形化管理界面,由于我这边的Kubernetes v1.5.2比较老,按官网的安装方法没有效果,现在试试手动安装,使用下面2个yaml文件安装 ...

阅读全文

k8s简单部署

K8s中文手册地址:https://www.kuboard.cn/learning/k8s-basics/kubernetes-basics.html#kubernetes%E5%8A%9F%E8%83%BD   这边安装的Kubernetes v1.5.2 比较...

阅读全文

欢迎留言