dockerfile自動構建docker 鏡像
# dockerfile 組成部分
1. 基礎鏡像信息 FROM centos:6.9
2. 製做鏡像操做指令 RUN yum install openssh_server -y
3. 容器啓動執行命令 CMD ["/bin/bash"]
# dockerfile 經常使用命令
docker logs 查看日誌(容器夯不住)
docker stop 容器ID # 中止容器
docker start 容器ID # 啓動
1. FROM 指定基礎鏡像
2. MAINTAINER 指定維護者信息,能夠沒有
3. LABLE 描述,標籤
4. RUN 全部的命令前面要加
5. ADD 會自動解壓,添加腳本文件
6. WORKDIR 設置當前工做目錄(在腳本中添加,每次進入容器後默認的目錄)
7. VOLUME 設置卷,關在主機目錄
8. EXPOSE 指定對外的端口 -p 隨機端口
9. CMD 指定容器啓動後要作的事情
############# 其餘命令 ##################
1. COPY 複製文件,不會解壓
2. ENV 環境變量
3. ENTRYPOINT 容器啓動後執行的命令,沒法被替換
# 排錯
容器啓動了,有的服務起了,有的沒起?
# 手動進入容器調試腳本
docker run -it centos6.9_ssh_nginx:v4 /bin/bash
# 正在運行的容器, docker exec 進入排錯
'''
VOLUMN /usr/share/nginx/html
VOLUMN : 每啓動一個容器,都會隨機建立一個卷
做用: 使用卷,能夠將目錄裏的內容持久化,容器刪了,卷還在,數據就在
EXPOSE 22 80
EXPOSE: 作隨機端口映射
ENTRYPOINT ["/bin/bash","init.sh"]
ENTRYPOINT: 不容許覆蓋初始啓動命令(先用CMD,測試好了再用ENTRYPOINT)
用戶自定義密碼
# echo "$SSH_PWD"|passwd --stdin root
ENV SSH_PWD 123456 # 設置默認的環境變量
啓動命令要帶參數: docker run -d -e "SSH_PWD = 123" -P centos6.9_ssh_nginx:v8
爲docker容器添加一個健康檢查機制
HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD /bin/bash /opt/test.sh
'''
vi /opt/tesh.sh
#!/bin/bash
cat /var/run/nginx.pid
if [ $?==0 ];then
echo 0
exit 0
else
echo 1
exit 1
fi
例一:單個服務
手動構建一遍,而後寫dockerfile
# dockerfile 放在同一的目錄下面
mkdir /opt/dockerfile
mkdir centos6.9_ssh
# 寫dockerfile
vim dockerfile
FROM centos:6.9
RUN curl -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum install openssh-server -y
RUN service sshd restart
RUN echo '12345'|passwd --stdin root
CMD ["/usr/sbin/sshd","-D"]
# dockerfile 寫完之後進行build
docker build -t centos6.9_ssh:v2 /opt/dockerfile/centos6.9_ssh
# 鏡像建立成功,啓動容器進行測試
docker run -d -p 1033:22 centos6.9_ssh:v2
'''
不一樣的RUN命令 能夠用 && \ 鏈接起來一次性執行
'''
例二: 多個服務
vim dockerfile
FROM centos:6.9
RUN curl -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum install openssh-server nginx -y
RUN service sshd restart
RUN echo '12345'|passwd --stdin root
ADD init.sh /init.sh # 將宿主機上的init文件拷貝到容器 /init.sh中
CMD ["/usr/sbin","/init.sh"]
# build
docker build -t centos6.9_ssh_nginx:v4
# 測試
docker run -d -p 2028:22 -p 85:80centos6.9_ssh_nginx:v4
docker ps -a -l
測試ssh 鏈接, ps -ef|nginx
經過dockerfile, 製做一個kodexplorer 網盤docker 鏡像
# nginx + php -fpm (httpd + php)
# 先手動裝一遍,而後寫dockerfile
1. 先啓動基礎容器
docker rm -f `docker ps -a -q`
docker run -it -p 80:80 centos:6.9
2. 改源
3. 裝php ,會自動將apach 裝好
yum install php -y
4. 起服務就能夠放php代碼
service httpd start # 默認站點目錄在 /var/www/html/
cd /var/www/html
rz -E kodexplorer4.40.zip
unzip kodexplorer4.40.zip
chown -R apache:apache .
yum install php-gd php-mbstring -y
service httpd restart
5. dockerfile
FROM centos:6.9
RUN yum install php unzip php-gd php-mbstring -y
WORKDIR /var/www/html
# rz -E kodexplorer4.40.zip 這裏從網上下載
ADD kodexplorer4.40.zip .
RUN unzip kodexplorer4.40.zip
RUN chown -R apache:apache .
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
# dockerfile 寫好之後build
docker build -t kod:v1 .
# 鏡像啓動容器
docker run -d -p 88:80 kod:v1
# 啓動腳本
vim init.sh
#!/bin/bash
service httpd restart
tail -F /var/log/httpd/access_log
'''
還能夠在dockerfile 中加健康檢查
'''
docker 鏡像分層
# 查看記錄
docker image history centos6.9_ssh_nginx:v3
# 導出docker 鏡像
docker save centos6.9_ssh_nginx:v3 > docker_centos6.9_ssh_nginx.tar.gz
# 將文件傳輸到另外一臺服務器
scp -rp docker_centos6.9_ssh_nginx.tar.gz 10.0.0.61:/root
# 導入鏡像
docker load -i docker_centos6.9_ssh_nginx.tar.gz
# 分層原理
1. 和宿主機共用內核 Kernel
2. Debian or Centos etc. # 一層鏡像
3. openssh_server # 兩層鏡像
4. nginx # 三層鏡像
-- 一個鏡像至少有一層
-- centos 被多個鏡像引用,只保存一份
-- 鏡像從最底層開始導入,最終合併成
-- cd /var/lib/docker/image/overlay2/layerdb
#!!! 由於經過parent找到父層,因此每次修改dockerfile 要放在最底下,儘可能走cache
分層好處: 複用,節省磁盤空間,相同的內容只加載一份到內存
修改dockerfile後,重建速度快
實現: 經過特殊的文件系統實現 overlayFS
容器間的互聯
# 容器間相互訪問
# 進入容器,用ssh 鏈接另一個容器
yum install openssh_clients
docker run -it --link 容器名:web centos6.9_ssh_nginx
ping web
# --link 在hosts 文件中自動加一行
-- ssh root@web
-- link 單向的,架構越後面的服務越先起,像數據庫等
使用docker 運行zabbix-server
# 下載相關的包
for n in `ls *.tar.gz`;do docker load -i $n;done
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
-- character-set-server=utf8 --collation-server=utf8_bin
....
docker 私有倉庫
# registry.tar.gz 鏡像
docker load -i registry.tar.gz
# 啓動容器 registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
# 上傳鏡像到私有倉庫
1. 給鏡像打標籤
docker tag 鏡像名 10.0.0.7:5000/鏡像名zabbix/zabbix-server-mysql:latest
2. 傳到私有倉庫
docker push 10.0.0.7:5000/鏡像名zabbix/zabbix-server-mysql:latest
# 上傳成功之後就能夠拉鏡像了
docker run -d 10.0.0.7:5000/鏡像名zabbix/zabbix-server-mysql:latest
# 鏡像倉庫加認證,帶basic 認證的registry
docker rm -f `docker ps -a -q`
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd -Bbn octivia 123 >> /opt/registry-var/auth/htpasswd
# 如今只能登陸私有倉庫才能上傳鏡像
docker login 10.0.0.7:5000
# 查看私有倉庫有哪些鏡像
10.0.0.7:5000/v2/_catalog
# 看某鏡像有幾個版本
10.0.0.7:5000/v2/鏡像名/tags/list
# 刪除私有倉庫鏡像(命令行不行)
手動進入registry 倉庫中
docker exec -it 倉庫ID /bin/sh
rm -rf /var/lib/registry/docker/registry/v2/repositories/zabbix/zabbix-java-gateway # 只刪除了鏡像的索引
registry garbage-collect /etc/docker/registry/config.yml # gc回收
'''
若是出現http錯誤,要改配置文件
resolve:
vim /etc/docker/daemon.json
{
"insecure-registries":["10.0.0.7:5000"]
}
systemctl restart docker
'''