一、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