-
作業系統從CentOS 5到CentOS 7;
-
Web Server從Apache到Nginx;
-
開發語言從最初的PHP 5.2到PHP 7,又到現在主要使用Go,馬上還會開始接觸C++;
-
資料庫從MySQL 5.1到現在的5.7,前陣子又開始折騰MariaDB;
-
Cache選型從Memcache到Redis;
-
佇列用過Kafka,去年開始大量使用NSQ。
-
指令碼只能在我當時的作業系統環境下執行。記得當時購買過不同服務商的VPS,雖然不同VPS我都使用同樣的Linux發行版,但指令碼通常都不能一鍵跑完。這也是沒辦法,因為每個VPS服務商都會製作自己的作業系統映象版本。
-
作業系統升級,如CentOS 5 – 6,或是換為Ubuntu,這樣基本上指令碼都跑不了。
-
軟體升級,如MySQL 5.2 – 5.6,構建工具改為CMake,依賴庫改變或升級。
-
如果某個軟體依賴的公共庫版本和其它軟體不同,且公共庫升級後和舊版不相容,那你就只能為這個軟體單獨編譯公共庫了,如果只是普通的公共庫還好,但如果是所需要的編譯工具版本不同,那可就慘了。
-
讓每個軟體執行在容器中,因為執行的容器環境是可以固定下來的,所以編譯安裝指令碼寫一個就可以了。
-
程式碼使用資料捲的方式載入到需要的容器中。
-
因為是開發環境,所以網路方面使用最簡單的–net=host。
-
將映象的建立、容器的啟動維護在Git專案中,並抽象出統一的構建過程,很方面的做到新軟體接入,新機器部署。
├── Dockerfile //建立映象的Dockerfile
├── pkg //編譯好的二進位制包,可以直接使用,此外軟體執行的一些配置檔案或第三方包也放在這裡
│ ├── conf
│ │ ├── fastcgi.conf
│ │ ├── http.d
│ │ ├── include
│ │ ├── koi-utf
│ │ ├── koi-win
│ │ ├── logrotate.conf
│ │ ├── logrotate.d
│ │ ├── mime.types
│ │ ├── Nginx.conf
│ │ ├── scgi_params
│ │ ├── uwsgi_params
│ │ └── win-utf
│ ├── luajit-2.0.3.tar.gz
│ └── Nginx-1.8.1.tar.gz
├── README.md
├── script //裡面放構建指令碼
│ ├── build_image.sh //構建映象使用
│ ├── build_pkg.sh //編譯軟體包時使用
│ ├── init.sh //容器啟動時執行
│ └── pre_build.sh //軟體依賴的共享庫,編譯和構建時都會用到
└── src //編譯時需要的軟體原始碼
├── modules
│ ├── ngx_devel_kit-0.2.19.tgz
│ ├── ngx_echo-0.53.tgz
│ └── ngx_lua-0.9.7.tgz
├── Nginx-1.8.1.tar.gz
└── openssl-1.0.2h.tar.gz
FROM andals/CentOS:7
MAINTAINER ligang
LABEL name="Nginx Image"
LABEL vendor="Andals"
COPY pkg/ /build/pkg/
COPY script/ /build/script/
RUN /build/script/build_image.sh
CMD /build/script/init.sh
-
把構建需要的包(PKG目錄中)放到映象中
-
把構建指令碼放到映象中
-
執行構建指令碼
-
容器啟動時,執行init.sh,裡面啟動相應的服務
ligang@vm-xUbuntu16 ~/devspace/dbuild $ git clone git@gitee.com:andals/docker-Nginx.git Nginx
Cloning into 'Nginx'...
......
ligang@vm-xUbuntu16 ~/devspace/dbuild $ cd Nginx/
ligang@vm-xUbuntu16 ~/devspace/dbuild/Nginx $ ngxVer=1.8.1
ligang@vm-xUbuntu16 ~/devspace/dbuild/Nginx $ docker build -t andals/Nginx:${ngxVer} ./
Sending build context to Docker daemon 30.7MB
Step 1/8 : FROM andals/CentOS:7
......
Successfully built ea8147743031
Successfully tagged andals/Nginx:1.8.1
ligang@vm-xUbuntu16 ~/devspace/dbuild/Nginx $ docker run -d --name=Nginx-${ngxVer} --volumes-from=data-home -v /data/Nginx:/data/Nginx --net=host andals/Nginx:${ngxVer}
dbf3c0617eb34c4b1b4ea54c2961989612d5474db3b1acd1d717221e6e5cb516
ligang@vm-xUbuntu16 ~ $ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
578912a08ea7 andals/CentOS:7 "echo Data Volumn Ho…" 9 days ago Exited (0) 9 days ago data-home
......
ligang@vm-xUbuntu16 ~ $ docker inspect 578912a08ea7
......
"Mounts": [
{
"Type": "bind",
"Source": "/home",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
......
ligang@vm-xUbuntu16 ~ $ tree -d /data/ -L 1
/data/
├── mariadb
├── Nginx
└── redis
ligang@vm-xUbuntu16 ~ $ tree -d /data/Nginx/
/data/Nginx/
├── conf
│ ├── http.d
│ ├── include
│ └── logrotate.d
└── logs
ligang@vm-xUbuntu16 ~ $ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbf3c0617eb3 andals/Nginx:1.8.1 "/bin/sh -c /build/s…" 33 minutes ago Up 33 minutes Nginx-1.8.1
3e31ef433298 andals/php:7.1.9 "/bin/sh -c /build/s…" 8 hours ago Up 8 hours php-7.1.9
360f94bf9c43 andals/jekyll:latest "/bin/sh -c /build/s…" 9 days ago Up 10 hours jekyll-latest
0a7d58d1ca5e andals/redis:4.0.8 "/bin/sh -c /build/s…" 9 days ago Up 10 hours redis-4.0.8
fdaa655b4a11 andals/samba:4.4.16 "/bin/sh -c /build/s…" 9 days ago Up 10 hours samba-4.4.16
6ad00a69befd andals/mariadb:10.2.14 "/bin/sh -c /build/s…" 9 days ago Up 10 hours mariadb-10.2.14
578912a08ea7 andals/CentOS:7 "echo Data Volumn Ho…" 9 days ago Exited (0) 9 days ago data-home
-
找到Nginx這個容器
-
進入Nginx這個容器
-
在容器裡面再執行reload
-
找到Nginx這個容器
-
使用docker exec
ligang@vm-xUbuntu16 ~ $ ll /lib/systemd/system/dstart.service
-rw-r--r-- 1 root root 229 4月 3 21:35 /lib/systemd/system/dstart.service
ligang@vm-xUbuntu16 ~ $ cat /lib/systemd/system/dstart.service
[Unit]
Description=Docker Container Starter
After=network.target docker.service
Requires=docker.service
[Service]
ExecStart=/usr/local/bin/dbox -dconfPath=/home/ligang/.dconf.json start all
[Install]
WantedBy=multi-user.target