技术流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

 

第五步:浏览器访问

 

 

 

 

 

 

 

 

 

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

  1. 2019年にはSINN社から独立しました BR02のベルトは正直に言わせて頂きますと、ラグ取り付け箇所部分のベルトが固く、装着時にラグ部分に負荷がかかり、 切れやすいです。
    オーバーホールとは、時計を部品単位まで全て分解した後、汚れやごみを全て除去した後に、必要な箇所に注油をして元通りに組み立てる作業を指します。
    摩耗や劣化で交換が必要になった部品は、ベル&ロス純正品で対応することが可能です。
    ※クレジットカードでのお支払は勿論、代金引換にてのお送りもさせて頂いております。
    名古屋の某ショップさんでは 時計を預け、ベルト代金とベルト交換代金(3,000円)も支払わねばなりません。
    デザインは好みがありますが、ベルロスの時計にデザインの上で、特別秀でたものを私個人は感じません。
    独特な形状のお時計も専用の工具で新品同様に復元させていただきます。
    腕時計メーカーとしてはまだ若いメーカーでありながら、独立後シャネルからのバックアップを受けるなど、その知名度と期待度は折り紙付き。
    ラルフ・ローレンが2005年発表の「BR01」に一目惚れし自社の広告ビジュアルに大々的に使用したのも有名です。
    すぐと言ってもノーメンテで10年近く普通に使える時計もありますがね。
    飛行機のコックピットの計器を模した角型の軍用時計で知られています。
    そういう観点から機械式時計なら全て丈夫と言えます。
    手を加えないで、ポン載せして、時計は50万です。
    ベル&ロスの腕時計を売るときに一番気を付けるべきは、買取店選びです。
    オーバーホールをしたとしても、買取価格にそれをペイできるだけの上乗せは期待できないからです。
    古き良き時代のヨーロッパを思わせるようなルックスから、やはり高価買取の期待できる品となっています。
    4.1 ベル&ロスに理解ある買取店を選ぶ!当店のベル&ロス専任技術者が豊富な経験でお時計に起こっているどんな小さな不具合も見落とさずに状態を診断いたします。
    当店ではベル&ロス(BELL & ROSS)の修理を多数行っております。

    スーパーコピーウブロ時計 https://www.watchergd.com/watch/product-15231.html

  2. 是非お試しあれ! 文字盤の中央にはビーのエンブロイダリーをあしらい、腕元で確かな存在感を放つ。
    アイコニックなウェブストライプを採用した引き通し式のナイロンストラップが、まるで文字盤を通過するようにデザインされた個性的なコレクション。
    ミリタリーウォッチに多く見られる引き通し式のファブリック製ストラップ、通称NATOベルトが今、時計界を席巻している。
    「黄金の10年」と言われる1960年代のイタリアの雰囲気を腕時計で表現したシンプルデザイン。
    1990年代に製造していたルミノックスの初期モデルを、創業30周年の節目に復刻。
    当店は「ベル&ロス」の正規代理店です。
    該当した期間が経過した場合、つまり6ヶ月コースなら6ヶ月経った時点でコールセンターに電話すると、強い引き止めもなく解約することは出来ます。
    ※本文中における素材の略称は以下のとおり。
    特許申請中というオレンジセラミックスベゼル上のスケールは、リキッドセラミックスとスーパールミノバによって記される。
    そのスタンスを体現しているのが、数多く展開されるファブリック製ストラップを採用するモデル。
    回数なしコースでも単品と比べてかなりコスパはよいです。
    つまり返品をしてもコースは継続なんてリスクはありません。
    Bell & Rossの新着商品は「Bell & Rossのベル&ロス 希少タイプデミナー 黒」「Bell & Rossのbell&ross 腕時計メンズ」「Bell & RossのベルロスBell&Ross 純正ラバーベルト 24mm 美品 BR03,BR01」などがあります。
    そしてこの”情熱をカタチにした時計ブランド”のベル&ロスはさらにロマンがあると思いませんか?
    航空機に使用されている計器をそのまま腕時計にする事で、見やすさと正確性を確立し46mmという巨大なケースでインパクト抜群にも関わらずデザインと質感を絶妙に合わせ、素晴らしく高い次元でバランスをとったシンプルで使い易くカッコいい腕時計を実現しました。
    カタログで採用されたベル&ロスの腕時計が、注目を集めないハズはありません。

    激安ブランドのオーデマピゲ腕時計 https://www.yutooz.com/protype/list-191.html

  3. 良い消息!良い消息!
    HEMRMESのブランドが必要で、注意します!
    当店、エルメス専門店。
    予約購入した後。
    あなたの特恵を与えた意外な喜びに。
    以下の条件を保証します:
    価格、特恵を与えます。
    必要な取引先、メールは連絡します。
    品質はとても良いです。
    使いを信じて、最も良いです。
    保証して、広大で、取引先は好きです。
    その他の世界一流スーパーコピー https://www.watcher007.com/

  4. I would like to express my love for your generosity for individuals that must have guidance on that topic. Your special commitment to getting the message along became definitely significant and have frequently empowered most people just like me to achieve their dreams. Your amazing warm and helpful recommendations can mean a lot a person like me and additionally to my peers. With thanks; from all of us.

  5. I wish to express my admiration for your kind-heartedness supporting those who really want assistance with this particular topic. Your special dedication to passing the solution up and down was certainly interesting and has really encouraged those just like me to achieve their dreams. Your personal helpful instruction signifies this much to me and even more to my mates. With thanks; from all of us.

  6. I precisely wanted to thank you very much yet again. I’m not certain what I would’ve implemented without these tips shown by you on such a field. Certainly was a scary problem for me, however , understanding the very skilled way you resolved it made me to leap over joy. I am just thankful for your support and thus hope you find out what a powerful job that you’re putting in training men and women with the aid of a web site. I’m certain you haven’t encountered all of us.

  7. I’m just commenting to make you understand of the really good experience my friend’s princess experienced studying your web site. She came to find some issues, most notably what it’s like to have an amazing coaching style to have other individuals easily grasp a number of hard to do subject areas. You undoubtedly exceeded our desires. Thank you for churning out these insightful, healthy, explanatory and also fun tips on your topic to Emily.

  8. I must express some appreciation to this writer just for bailing me out of such a difficulty. Because of surfing through the world wide web and meeting views which are not powerful, I was thinking my entire life was gone. Existing devoid of the answers to the problems you have solved as a result of your main posting is a serious case, and those which might have negatively damaged my entire career if I hadn’t noticed the website. Your good capability and kindness in controlling all the stuff was important. I’m not sure what I would have done if I had not discovered such a point like this. I am able to at this moment look forward to my future. Thanks for your time so much for this impressive and amazing help. I won’t be reluctant to endorse your web blog to anyone who should receive guidance about this subject.

  9. I actually wanted to send a quick word to be able to say thanks to you for those fabulous concepts you are showing on this website. My time-consuming internet research has now been compensated with brilliant content to share with my partners. I would tell you that we website visitors actually are rather fortunate to exist in a wonderful network with many perfect individuals with helpful techniques. I feel pretty fortunate to have seen your entire website page and look forward to plenty of more enjoyable times reading here. Thanks once more for a lot of things.

  10. I want to show my gratitude for your kind-heartedness in support of men who need help with in this field. Your personal dedication to getting the solution around had been pretty interesting and have in most cases encouraged ladies like me to get to their endeavors. Your amazing important publication signifies so much a person like me and far more to my colleagues. Thanks a lot; from all of us.

  11. I would like to show thanks to the writer just for bailing me out of such a trouble. Right after surfing around throughout the world wide web and obtaining advice that were not powerful, I believed my entire life was done. Being alive without the answers to the issues you have solved all through the website is a critical case, and the ones which may have adversely affected my entire career if I hadn’t come across your blog post. Your own competence and kindness in dealing with the whole thing was vital. I’m not sure what I would have done if I had not come upon such a subject like this. I’m able to now relish my future. Thanks for your time very much for the professional and results-oriented guide. I won’t hesitate to refer your web sites to anyone who needs to have guidelines on this subject.

发表评论

邮箱地址不会被公开。