技术流ken

运维拯救世界

课堂记录:Dockerfile创建镜像(四)–技术流ken

复习

 

两类映射

1.端口映射

2.数据卷映射

 

 

1.端口映射

一:容器端口随机映射到物理机的一个端口-P

二:容器的端口映射到物理机的一个特定的端口 -p 80:80

三:容器的端口映射到物理机的一个特定的网卡上的随机端口 -p ip::80

四:容器的端口映射到物理机的一个特定的网卡上的特定端口 -p ip:80:80

 

2.数据卷—实现数据的持久化

一:bind mount volume

-v /ken:/var/www/html

 

二:docker managerment volume

-v /var/www/html

 

三:基于一个现有的容器

–volumes-from

 

 

docker使用数据库实现数据持久化演示

 

第一步:搜索数据库镜像并下载相应的数据库镜像

[root@localhost ~]# docker search mysql

 

第二步:启动数据库

[root@localhost ~]# docker run -d -v /ken:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 --name mysql1 mysql

 

-e 指定设置环境变量。MYSQL_ROOT_PASSWORD指定数据库登录的初始密码

 

第三步:访问数据库

[root@localhost ~]# docker run -it mysql mysql -uroot -p123 -h172.17.0.2
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> create database ken;
Query OK, 1 row affected (0.22 sec)

 

第四步:销毁容器并验证数据持久化

[root@localhost ~]# docker run -d -v /ken:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql
d9655ecf33e7b8f11fb231e9b0a398f61d48268c084ef184e110fced55491364
[root@localhost ~]# docker exec -it d9655ecf33e7b8f11fb23 bash
root@d9655ecf33e7:/# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
root@d9655ecf33e7:/# mysql -uroot -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ken                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> 

 

 

两个容器之间建立连接

[root@localhost ~]# docker run -it --link mysql:mysql mysql mysql -uroot -p123 -hmysql
Unable to find image 'mysql:latest' locally
^C
[root@localhost ~]# docker run -it --link flamboyant_gauss:mysql mysql mysql -uroot -p123 -hmysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> 

--link flamboyant_gauss:mysql

格式:容器名:别名

 

Dokcefile详解

Dockerfile编写注意项

  • # 井号进行备注
  • 指令参数,指令的大小写不敏感,但是规范来写都是大写!
  • 第一个非注释行必须是FROM指令
  • 编写Dockerfile必须在一个目录下进行,这个目录称之为 工作目录(WORKSPACE)
  • Dockerfile文件命令的首字母必须大写
  • 制作镜像所要用的文件必须放在工作目录或者工作目录的子目录之下,不能放在父目录
  • 可以通过隐藏文件 .dockeringnore 来指定不要放入到镜像中的文件,一行是一个文件,可以用通配符
  • 基于dockerfile做镜像,本质上还是基于一个现有的镜像做新镜像

 

dockerfile常用指令

 

1.FROM指令

作用:指定使用哪个基础镜像
格式:

FROM 镜像名    注册表/镜像名:tag

例如:

FROM busybox

 

2.ENV

作用:设置环境变量

格式:

1.ENV 变量名=变量值

2.ENV 变量名 变量值

 

例如:

ENV name=ken age=18

引用变量:$name $age

 

3.label

作用:设置标签,注释

格式:

label key=value

例如:

LABEL author=ken

 

4.RUN

作用:执行命令

格式:

RUN CMD

 

多个命令:

方法一:

RUN CMD1;CMD2

 

方法二:

RUN CMD1&&CMD2

 

注意:

1.因为docker镜像是分层机制,应当尽量减少层次,所以如果在创建镜像的时候需要执行多个命令,建议使用一个RUN 指令,执行多个命令。

2.RUN 指令默认是在shell中环境中执行,docker镜像当中的shell类型默认为/bin/sh/ -c

 

5.COPY

作用:复制文件到镜像中

格式:

COPY src dest/

注意:

  • 源文件路径用相对路径,目标一般用绝对路径
  • 也可以通配符
  • 源文件必须在工作目录或者工作目录的子目录中
  • 目标路径可以不存在,会自动创建
  • 如果源文件是一个目录,会自动递归复制目录下的文件到目标位置,但是目录自身不会复制
  • 如果复制多个文件,或者源文件中用了通配符,那么目标路径必须以 / 为结尾

 

6.WORKDIR

作用:指定工作目录

格式:

WORKDIR path

例如:

WORKDIR /ken

 

7.EXPOSE 80

作用:暴露容器端口

格式:

EXPOSE PORT

例如:

EXPOSE 80/tcp

 

注意:这里声明暴露端口并不是说在启动容器的时候,容器会自动暴露相关的端口,而是需要管理员使用-P 选型进行端口暴露。

 

8.VOLUME

作用:声明需要映射的数据卷

格式:

VOLUME path

例如:

VOLUME /usr/share/nginx/html/

注意:如果在构建镜像时使用volume声明了需要暴露的数据卷路径,在启动容器的时候回自动和宿主机的一个目录进行绑定!docker manaagerment volume

 

9.ADD

作用:和copy相似,也是复制文件到镜像中,可以在网上下载文件到镜像中,也可以自动复制tar.gz包到镜像中并实现自动解决

格式:

ADD sec dest

例如:

ADD web.tar.gz /usr/share/nginx/html/

 

10.CMD    注意!CMD和ENTRYPOINT执行的命令都是pid为1的命令

作用:执行命令,一个Dockerfile中可以有多个CMD指令,但是只有最后一个CMD指令生效

三种格式:

格式1:

CMD com  –>是在shell中执行相关的cmd,默认类型为/bin/sh -c

例如:

CMD cat test –> /bin/sh -c cat test

格式2:

CMD [“com”,”para1″,”para2″]

例如:

CMD [“cat”,”test”]  –>cat test

 

格式三:

CMD [“para1″,”para2”]  –>需要和ENTRYPOIN指令一起使用,CMD的选项会被当做参数传递给ENTRYPOINT指令

 

11.ENTRYPOINT

作用:也是执行命令

格式:

格式1:

ENTRYPOINT cat test –> /bin/sh -c cat test

格式二:

ENTRYPOINT  [“com”,”para1″,”para2″]

 

 

12,ONBUILD

作用:定义触发器

格式:

ONBUILD cmd

例如:

ONBUILD yum install lrzsz -y

 

 

演示1:使用nginx镜像来演示上述所有指令

第一步:编写dockerfile

[root@localhost ~]# mkdir /nginx
[root@localhost ~]# cd /nginx
[root@localhost nginx]# vim Dockerfile
#this is for test nginx
FROM nginx:latest
LABEL author=ken
ENV path=/usr/share/nginx/html/ pack=nginx-1.12.2.tar.gz
WORKDIR $path
COPY jd1  $path
RUN touch testnginx
ADD https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/at-sysvinit-3.1.13-24.el7.x86_64.rpm ./
ADD $pack ./
EXPOSE 80
VOLUME $path
ONBUILD ADD https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/at-sysvinit-3.1.13-24.el7.x86_64.rpm ./
CMD ["-g","daemon off;"]
ENTRYPOINT ["nginx"]

 

第二步:构建镜像

[root@localhost nginx]# docker build -t nginx:v1 .

 

第三步:查看镜像信息

[root@localhost nginx]# docker image ls
[root@localhost nginx]# docker history nginx:v1

 

第四步:使用创建的镜像启动容器

工作目录:

数据卷:/var/lib/docker/volume/

端口:

[root@localhost nginx2]# docker run -d -P nginx:v2

 

错误日志:

[root@localhost nginx]# docker logs 2db0a5411551
2019/08/15 03:18:30 [emerg] 1#1: unexpected end of parameter, expecting ";" in command line
nginx: [emerg] unexpected end of parameter, expecting ";" in command line

 

 

演示2:制作LAMP架构镜像并上线wordpress

第一步:拉取centos7镜像

并按照如下的dockerfile初始化镜像

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

 

第二步:编写制作LAMP架构的dockerfile

FROM local/c7-systemd
COPY local.repo /etc/yum.repos.d/
COPY wordpress /var/www/html/
RUN yum -y install httpd mariadb-server php php-mysql; yum clean all; systemctl restart mariadb httpd;systemctl enable mariadb httpd.service
EXPOSE 80 3306
CMD ["/usr/sbin/init"]

 

1.使用第一步创建出来的镜像

2.把local.repo文件发送到镜像中,因为镜像文件没有mariad数据库

local.repo文件内容

[local]
name=local
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/

 

3.把配置好的wordpress安装包复制到网站根目录下

4.下载LAMP架构

5.暴露80 和3306 端口

6.启动

第三步:运行容器

[root@ken-node3 centos]# docker run -d -v /sys/fs/cgroup/:/sys/fs/cgroup/   -p 888:80 --privileged  centos-wordpress:v1

 

–privileged 让容器能够获得更多特权,否则在容器内部不能使用systemctl,会报如下的错

Failed to get D-Bus connection: Operation not permitted

 

第四步:进入容器创建数据库

[root@ken-node3 centos]# docker exec -it f80ed6fb67b3 bash
[root@f80ed6fb67b3 /]# ls /var/www/html/
index.php                  wp-activate.php       wp-config-sample.php  wp-links-opml.php  wp-register.php
license.txt                wp-admin              wp-config.php         wp-load.php        wp-settings.php
readme.html                wp-app.php            wp-content            wp-login.php       wp-signup.php
wordpress                  wp-blog-header.php    wp-cron.php           wp-mail.php        wp-trackback.php
wordpress-3.3.1-zh_CN.zip  wp-comments-post.php  wp-includes           wp-pass.php        xmlrpc.php
[root@f80ed6fb67b3 /]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.60-MariaDB MariaDB Server

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

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

MariaDB [(none)]> create database ken;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on *.* to ken@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit
Bye

 

第五步:浏览器访问

 

 

 

 

 

 

 

 

 

发表评论

电子邮件地址不会被公开。