dockerfile

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

'''
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息