3 Dockerfile(构建容器)

一、Dockerfile

Dockerfile可以构建容器。

通过指令

1、指令
    1、依赖基础镜像的指令,必须在Dockerfile的顶端
    FROM    
    
    2、执行命令的指令(RUN指令执行的命令,必须是基础容器中支持的命令),将执行的结果保存到镜像中
    RUN 
    [root@localhost docker]# vim Dockerfile
    [root@localhost docker]# cat Dockerfile
FROM nginx
RUN echo "123" > /usr/share/nginx/html/index.html
    [root@localhost docker]# docker build -t test:v1 .
    [root@localhost docker]# docker run -it -d -p 8090:80 test:v1
    此时访问192.168.15.105:8090可访问到123
    
    3、添加文件到镜像
    ADD
    
    注:
        1、ADD支持解压功能(仅支持tar解压)
        2、支持远程下载功能,但是如果是远程下载的文件,则不解压
        
        [root@localhost docker]# vim Dockerfile
        [root@localhost docker]# cat Dockerfile
FROM nginx
RUN echo "123" > /usr/share/nginx/html/index.html
ADD linux.tar.gz /opt
COPY linux.tar.gz /mnt
        
        [root@localhost docker]# docker build -t test:v2 .
        [root@localhost docker]# docker run -it test:v2 bash
        root@3f1acafd8fd5:/# cd /opt
        drwxr-xr-x 4 root root 55 Dec 27 14:44 linux
        root@3f1acafd8fd5:/opt# cd /mnt
        root@3f1acafd8fd5:/mnt# ls -l
        total 8
        -rw-r--r-- 1 root root 4097 Dec 29 11:40 linux.tar.gz
        
        
        
    4、复制文件到镜像
    COPY
    
    5、暴露端口
    EXPOSE
    
        80 443
        80/tcp 443/udp
        
        [root@localhost docker]# cat Dockerfile
FROM nginx
RUN echo "123" > /usr/share/nginx/html/index.html
ADD linux.tar.gz /opt
COPY linux.tar.gz /mnt
EXPOSE 80/tcp 443/udp
        
        
    6、工作目录:在容器内执行命令的目录
    WORKDIR(运行容器的第一个目录)
    [root@localhost docker]# docker run --rm -it test:v5 bash
root@bfe58391415c:/# 
    [root@localhost docker]# vim Dockerfile
    WORKDIR /opt
[root@localhost docker]# docker build -t test:v5 .
    [root@localhost docker]# docker run --rm -it test:v5 bash
root@bfe58391415c:/opt# 
    
    7、设置容器启动时执行的命令
    CMD 
[root@localhost docker]# vim Dockerfile
FROM python:3.6
RUN pip install django
ADD linux.tar.gz /opt
EXPOSE 80
WORKDIR /opt/linux
CMD python manage.py runserver 0.0.0.0:80
[root@localhost docker]# docker build -t test:v6 .
[root@localhost docker]# docker run -d --name djangov2 -P test:v6
1b23dc47e7d1326a5b01ac8f68caa83bc77f86cbacb9d1a10050ca16528806cf
[root@localhost docker]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                  NAMES
1b23dc47e7d1   test:v6           "/bin/sh -c 'python …"   14 seconds ago   Up 14 seconds   0.0.0.0:4000->80/tcp   djangov2
此时访问192.168.15.105:4000出现django界面

    8、定义Dockerfile变量的指令
    ARG
    [root@localhost docker]# cat Dockerfile
FROM python:3.6
RUN pip install django
ADD linux.tar.gz /opt
ARG package=pymysql      
RUN pip install $package      #构建镜像会下载pymysql
EXPOSE 80
WORKDIR /opt/linux
CMD python manage.py runserver 0.0.0.0:80

[root@localhost docker]# docker build --build-arg=package=redis -t test:v7 .   #另一种定义变量的方式,在外面定义,不需要修改Dockerfile


    9、触发器指令(构建时不作任何操作,但是在作为基础镜像时触发)
    ONBUILD  #后面跟指令
    FROM test:v7   #作为基础镜像
    ONBUILD RUN touch /opt/1.txt

2、构建镜像的命令
    docker build -t [镜像名称] [Dockerfile的路径]
    [root@localhost docker]# docker build -t test:v1 .

注:
    1、Dockerfile的文件名
    2、一旦开始构建容器,当前目录会被虚拟到Docker容器中

二、利用dockerfile构建 Nginx + Django

[root@localhost ~]# cd work 
[root@localhost ~]# mkdir django
[root@localhost ~]# mkdir nginx

#1、Django
[root@localhost work]# cd django/
[root@localhost django]# mv ~/docker/linux.tar.gz .
[root@localhost django]# cat Dockerfile 
FROM python:3.6
ADD linux.tar.gz /opt
EXPOSE 80
WORKDIR /opt/linux
RUN pip install django
CMD python manage.py runserver 0.0.0.0:80
[root@localhost django]# docker build -t django:v1 .


#2、Nginx
[root@localhost work]# cd nginx
[root@localhost nginx]# vim default.conf
[root@localhost nginx]# cat default.conf 
server {
    server_name _;
    listen 80;
    location / {
        proxy_pass http://django;
    }
}

[root@localhost nginx]# cat Dockerfile 
FROM nginx
ADD default.conf /etc/nginx/conf.d/   
EXPOSE 80
CMD nginx -g 'daemon off;'   #前台启动nginx命令
这里不定义workdir也行,因为不需要启动什么命令

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

[root@localhost nginx]# docker run -d --name django1 --network tiantian django:v1
[root@localhost nginx]# docker run -d --name nginx1 -P --network tiantian nginx:v1

三、容器化BBS

#简版

1、mysql

    docker run -d --name mysql --network chenyang1 -p 3306:3306  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

2、bbs

    1、Dockerfile
    [root@localhost bbs]# cat bbs/Dockerfile 
    FROM python:3.6
    ADD ./ /opt/
    WORKDIR /opt 
    RUN pip install -Ur requirements.txt
    EXPOSE 80
    CMD python manage.py runserver 0.0.0.0:80

    2、数据迁移

3、nginx
[root@localhost nginx]# cat Dockerfile 
FROM nginx
ADD default.conf /etc/nginx/conf.d/
EXPOSE 80
CMD nginx -g 'daemon off;'

[root@localhost nginx]# cat default.conf 
server {
    server_name _;
    listen 80;
    location / {
        proxy_pass http://bbs;
    }
}

#详细版

[root@localhost ~]# mkdir bbs
[root@localhost ~]# cd bbs
[root@localhost bbs]# rz -E

[root@localhost bbs]# unzip bbs.zip

[root@localhost bbs]# cd bbs
1.mysql [root@localhost bbs]# docker run -d --name mysql --network tiantian -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 #创建一个mysql容器 [root@localhost bbs]# docker ps
 进入容器内创建bbs
[root@localhost bbs]# docker exec -it mysql bash

root@1fe839f7ee82:/# mysql -uroot -p123456
mysql> create database bbs;
mysql> exit
2.bbs
1.创建一个requirements.txt文件,里面写上需要pip安装的环境
[root@localhost bbs]# vim requirements.txt

django==1.11.11
pymysql
pillow

  yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y
  执行 pip3 install -Ur requirements.txt

 2.进入app01
[root@localhost bbs]# ll app01/
[root@localhost bbs]# rm -rf app01/migrations/    #删除历史迁移
[root@localhost bbs]# mkdir app01/migrations/
[root@localhost bbs]# touch app01/migrations/__init__.py
3.数据库迁移(此时settings.py中“HOST”是127.0.0.1,["*"] ,123456
[root@localhost bbs]# python3 manage.py makemigrations

[root@localhost bbs]# python3 manage.py migrate
4.修改django的settings配置文件如下
[root@localhost bbs]
# vim bbs/settings

   ALLOWED_HOSTS = ['*']
   DATABASES = {
            'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'bbs', ===》要和上面的库名一样
            'USER': 'root',
            'PASSWORD': '123456',
            'HOST': 'mysql', ===》数据库host为我们创建的数据库容器mysql
            'PORT': '3306', ===》虚拟成镜像就不能用127.0.0.1了,要用mysql容器的names
            'CHARSET': 'utf8',
            }
            }

5.Dockerfile
[root@localhost bbs]# vim bbs/Dockerfile 
    FROM python:3.6
    ADD ./ /opt/
    WORKDIR /opt 
    RUN pip install -Ur requirements.txt
    EXPOSE 80
    CMD python manage.py runserver 0.0.0.0:80
    
 [root@localhost bbs]# docker build -t bbs:v1 .
 6.运行镜像
[root@localhost bbs]# docker run -d --name bbs --network tiantian bbs:v1

[root@localhost bbs]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS             PORTS                               NAMES
45d6df27abea   bbs:v1            "/bin/sh -c 'python …"   30 seconds ago      Up 29 seconds      80/tcp  

#服务启了,但是没有创建端口,创nginx
3.nginx
[root@localhost bbs]# cd .. [root@localhost bbs]# ll total 424 drwxr-xr-x 7 root root 133 Dec 29 22:53 bbs -rw-r--r-- 1 root root 431029 Dec 29 16:42 bbs.zip [root@localhost bbs]# mkdir nginx [root@localhost bbs]# cd nginx/
#1.配置nginx反向代理
[root@localhost nginx]# vim default.conf server { server_name _; listen 80; location / { proxy_pass http://bbs; } }

#2.配置nginx的Dockerfile
[root@localhost nginx]# vim Dockerfile

FROM nginx
ADD default.conf /etc/nginx/conf.d/
EXPOSE 80
CMD nginx -g 'daemon off;'     =====》设置全局配置命令,取消nginx守护进程,容器必须要有1个进程运行在前台

#3.创建nginx镜像
[root@localhost nginx]
# docker build -t nginx:v2 .

#4.运行nginx容器
[root@localhost nginx]# docker run -d --name nginxv2 --network tiantian -p 8091:80 nginx:v2 [root@localhost nginx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 36f2694a8a93 nginx:v2 "/docker-entrypoint.…" 16 seconds ago Up 15 seconds 0.0.0.0:8091->80/tcp nginxv2 45d6df27abea bbs:v1 "/bin/sh -c 'python …" 14 minutes ago Up 14 minutes 80/tcp bbs 1fe839f7ee82 mysql:5.7 "docker-entrypoint.s…" 43 minutes ago Up 43 minutes 0.0.0.0:3306->3306

 容器化BBS

1、mysql
 docker run -d --name mysql --network xul -p 3306:3306  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7入门
  # 创建一个mysql容器
 mysql> create database bbs;
  # 进入容器内创建bbs库
2、bbs
 1,创建一个requirements.txt文件,里面写上需要pip的环境
  [root@localhost bbs_19_py]# cat requirements.txt 
            django==1.11.11
            pymysql
            pillow
    yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y
  执行 pip3 install -Ur requirements.txt
 2. 进入app01
  rm -rf ./migrations/*               =====》删除历史迁移
  touch ./migrations/__init__.py
 3. 数据库迁移(此时'HOST'是127.0.0.1)
  python3 manage.py makemigrations
  python3 manage.py migrate
  
 4. 修改django的settings配置文件如下 
  ALLOWED_HOSTS = ['*']
  DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'bbs',                              ===》要和上面的库名一样
                'USER': 'root',
                'PASSWORD': '123456',
                'HOST': 'mysql',        ===》数据库host为我们创建的数据库容器mysql
                'PORT': '3306',      ===》虚拟成镜像就不能用127.0.0.1了,要用mysql容器的names
                'CHARSET': 'utf8',
            }
        }

 5、Dockerfile
        [root@localhost django]# cat Dockerfile 
        FROM python:3.6
        copy ./bbs_19_py/ /opt
        WORKDIR /opt
        RUN pip3 install -Ur requirements.txt
        EXPOSE 80
        CMD python manage.py runserver 0.0.0.0:80
        
     6.运行镜像
  [root@localhost django]# docker run --name bbs --network xul -d bbs:v1


3、nginx
 (1)配置nginx反向代理
    [root@localhost nginx]# cat default.conf 
    server {
        server_name _;
        listen 80;
        location / {
            proxy_pass http://bbs;
        }
    }
 
 (2)配置nginx的dockerfile
    [root@localhost nginx]# cat Dockerfile 
    FROM nginx
    ADD default.conf /etc/nginx/conf.d/
    EXPOSE 80
    CMD nginx -g 'daemon off;'                 =====》设置全局配置命令,取消nginx守护进程,容器必须要有1个进程运行在前台
    
    (3) 创建nginx镜像
     docker build -t nginx:bbs .
 
 (3)运行nginx容器
     docker run --name nginxbbs -d --network xul -p 8001:80 nginx:bbs

 

posted @ 2021-12-29 23:22  甜甜de微笑  阅读(373)  评论(0编辑  收藏  举报