天天看點

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      
3 Dockerfile(建構容器)

 容器化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