dockerfile

dockerfile

自定义镜像--------通过dockerfile创建的都是镜像

创建镜像的方式:

1、dockerfile 最基本的方式 最常用的方式

2、docker pull 拉取的事最基础 的镜像,只有基础功能,没有定制化的功能

3、基于基础镜像,创建好了容器之后再容器内部进行定制化的操作,然后导出成镜像,下一次继续使用。

基于dockerfile创建:
联合文件系统:UnionFS

这个docker镜像的基础,镜像通过分层来进行集成。基于基础可以制作各种具体的应用镜像。

特性:一次性同时的加载多个文件系统,但是从外看只能看一个文件系统,文件系统叠加

镜像加载的原理:
一层一层的文件系统自称的

rootfs:根文件系统,包含了一个完整的文件系统(操作系统):包括了所有的文件和目录,以及相关的权限和用户等信息

运行容器时,整个的根文件系统就会整个被使用,作为应用的运行的环境

bootfs:引导文件系统,启动根系统时需要加载的核心文件

在这里插入图片描述

dockfile定制化镜像:定制每一层需要添加的配置和文件。把每一层的修改,安装,构建和操作都写入到一个脚本。

用脚本来进行创建镜像

这个脚本就是dockfile

dockfile分为4个部分:
1、基础镜像信息 底层

2、维护者信息(可有可无)

3、镜像的操作指令和相关配置

4、容器启动时执行的命令

可以支持#开头作为注释

dockfile的命令:

FROM:永远是整个脚本第一个语法,指定定制镜像的基础操作系统

MAINTAINER:维护者信息,可以不写 新版本LABEL来代替

RUN:在基础镜像上执行的命令,然后把运行结果整合到新镜像中。RUN就是一个镜像的分层,RUN越多,分层就越多,镜像越大。为了控制镜像的大小,多个RUN尽可能的写在一个RUN里面

ENTRYPOINT:指定容器在启动时执行的命令或者参数

RUN和ENTRYPOINTA区别:run是执行后结束,并不能持续化发的运行,entrypoint在docker run时就执行里面的命令,只要容器还在运行,就持续化的执行

CMD:指定容器在启动时执行的命令或者参数

EXPOSE:指定容器对外暴露的端口号

ENV:用来设置基础操作系统的环境变量,以便RUM命令使用,或者新镜像使用,就是给系统添加环境变量

ADD:支持URL从网络下载文件,也可以对压缩文件进行解压

COPY:只能复制本地(宿主机文件)到镜像的目标为止

VOLUME:创建一个容器内的挂载点,不是和宿主机进行挂载,

USER:设置运行镜像时用户

WORKDIR:指定容器的工作目录,相当于切换到这个目录,在这个目录下做指定的操作

ONBUILD:指定一个镜像作为另一个镜像构建的基础需要运行的命令

ARG:用来传参数,用户传递的参数。ENV是容器内部的比那辆

cmd和entrypoint区别

1、entrypoint有多个情况,只会运行最后一个

2、cmd有多个的情况下,也是运行最后一个

3、cmd和entrypoint同时存在,命令都会执行,entrypoint会覆盖cmd的命令,并且cmd会把命令作为参数传给entrypoint

作为容器启动时执行命令的语句,一般情况下二者是通用的,但是在传参的情况下,需要加上cmd。如果没有特殊的操作(传参),写一个entrypoint或者cmd即可,二者不用同时存在

cmd作为启动命令,运行容器时传了额外的参数,cmd会被覆盖不会被执行

entrypoint不会被覆盖,容器运行时指定的相当于给entrypoint传参

cd /opt
mkdir test1
cd test1
vim Dockerfile
FROM centos:7

CMD ["ls","/etc"]
ENTRYPOINT ["ls","/usr"]

docker build -t centos:test .
docker run -it --name test1 centos:test

RUN在基础镜像运行然后把结果传给新镜像。

RUN的结构要合理,不要太多,否则镜像太大

RUN优化

&&:将多个RUN指令写在一起。前一个指令成功才会执行下一个

;:前一个不管成不成功,后一个都会执行

||:前面一个失败了后一个才会执行

\:把一个命令分成多个行,提高可读性

vim Dockerfile
FROM centos:7

RUN ls /opt && ls /etc && ls /usr
RUN ls /opt ; ls /etc ; ls /usr
RUN ls /opt || ls /etc || ls /usr

COPY和ADD

ADD是解压,.tar .gz .zip

根据URL进行文件下载,复制(官方解释:同样是复制,推荐使用COPY)

add没有办法复制压缩文件

copy:只能复制,复制本地文件到容器内

ADD http://mirrors.aliyun.com/repo/Centos-7.repo /opt/Centos-7.repo
#ADD根据URL进行下载
ADD wordpress-6.4.2-zh_CN.tar.gz /opt
#ADD解压文件,这个文件只能和脚本在同一个目录里
COPY test1.txt /opt/test
#复制本地文件

工作目录和环境变量以及容器卷(挂载卷)

工作目录:切换到容器内的指定目录

WORKODIR

ENV:添加一个PATH

EXPOSE 指定端口

VOLUME 指定和宿主机挂载目录(挂载卷)

WORKDIR /opt
#更改工作目录
ENV PATH /opt/test:$PATH
#将/opt/test添加到环境变量里 

练习,yum安装定制一个nginx

cd /opt
mkdir test1
cd test1
vim Dockerfile
#只能是这个名字
FROM centos:7

RUN rm -rf /etc/yum.repos.d/*

ADD http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/

RUN yum -y install epel-release && yum -y install nginx

EXPOSE 80
#指定端口
WORKDIR /var/log/nginx/
#指定工作目录
VOLUME ["/usr/share/nginx/html"]
#指定和宿主机挂载目录(挂载卷)
ENTRYPOINT ["nginx","-g","daemon off;"]
#手动启动nginx
RUN rm -rf /usr/share/nginx/html/index.html && echo 456 > /usr/share/nginx/html/index.html
#在html文件里面,index.html的软件挂了,导致在外面curl不同,会出现403,需要重新手动写
dockerfile 部署lnmp
n	nginx1.22	172.111.0.10	
m	msyql8.0	172.111.0.20
p	php8.127	172.111.0.30

docker:单节点部署,在一台机器上部署,跨机器容器无法通信。做高可用只能在节点上增加同一服务的容器数量

cd /opt
mkdir nginx mysql php
cd nginx
拖nginx安装包
拖wordpress安装包


vim Dockerfile
FROM centos:7
MAINTAINER this is nginx <lnmp>
RUN rm -rf /etc/yum.repos.d/*
ADD http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
ADD nginx-1.22.0.tar.gz /usr/local/src/
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/nginx-1.22.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make -j 4 && make install
ENV PATH /usr/local/nginx/sbin/:$PATH
COPY nginx.conf /usr/local/nginx/conf/
ADD wordpress-6.5.2-zh_CN.zip /usr/local/nginx/html
RUN chmod 777 -R /usr/local/nginx/html/
EXPOSE 80
VOLUME ["/usr/local/nginx/html/"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

vim nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.php;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ {
            root           html;
            fastcgi_pass   172.111.0.30:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }
}
}

docker build -t nginx;lnmp .
docker network create --subnet=172.111.0.0/24 --opt "com.docker.network.bridge.name"="lnmp" mynetwork
docker run -itd --name nginx -p 80:80 -m 512m -v /opt/nhtml:/opt/nginx --net mynetwork --ip 172.111.0.10 nginx:lnmp
docker exec -it nginx bash

cd /opt/mysql
拖mysql安装包
vim my.cnf
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

vim Dockerfile
FROM centos:7
MAINTAINER this is mysql <lnmp>
RUN rm -rf /etc/yum.repos.d/*
ADD http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/
RUN yum -y install libaio numactl-libs pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin mysql
ADD mysql-8.0.30-el7-x86_64.tar.gz /usr/local/
RUN mv /usr/local/mysql-8.0.30-el7-x86_64 /usr/local/mysql
COPY my.cnf /etc/my.cnf
EXPOSE 3306
RUN chown -R mysql:mysql /usr/local/mysql/ && chown mysql:mysql /etc/my.cnf
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql/bin/
RUN ./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
VOLUME ["/usr/local/mysql"]
ENTRYPOINT ["./mysqld"]

docker build -t mysql:lnmp .
docker run -itd --name mysql -p 3306:3306 --privileged -v /opt/mysql1:/opt/mysql --net mynetwork --ip 172.111.0.20 mysql:lnmp
docker exec -it mysql bash
mysql -u root -p
mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)
 
mysql> CREATE USER 'root'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER 'wordpress'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)




/opt/php
导入
[root@docker1 php]# ll
总用量 19496
-rw-r--r--. 1 root root     1151 8月  16 11:20 Dockerfile
-rw-r--r--. 1 root root 19853305 7月   3 11:21 php-8.1.27.tar.gz
-rw-r--r--. 1 root root     5375 8月  16 11:12 php-fpm.conf
-rw-r--r--. 1 root root    73498 8月  16 11:12 php.ini
-rw-r--r--. 1 root root    21316 8月  16 11:12 www.conf

vim Dockerfile 
FROM centos:7
MAINTAINER this is php <lnmp>
RUN rm -rf /etc/yum.repos.d/*
ADD http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/
RUN yum install -y epel-release 
RUN yum -y install gcc gcc-c++ make \
gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
oniguruma-devel \
sqlite-devel
ADD php-8.1.27.tar.gz /usr/local/src/
WORKDIR /usr/local/src/php-8.1.27
RUN  ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-pdo-mysql \
--with-openssl \
--with-sqlite-devel \
--with-oniguruma-devel \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make -j 4 && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
COPY php.ini /usr/local/php/lib/
COPY php-fpm.conf /usr/local/php/etc/
COPY www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE  9000
CMD ["/usr/local/php/sbin/php-fpm","-F"]


vim www.conf
listen = 172.18.0.13:9000
vim php.ini


docker build -t php.lnmp  .

docker run -itd --name php --net mynetwork --ip 172.111.0.30 -p 9000:9000 --volumes-from  nginx --volumes-from mysql php:lnmp 
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值