標籤(空格分隔): docker的部分php
一:Docker概述html
二:Docker安裝java
三:鏡像管理node
四:容器管理mysql
五:管理應用程序數據linux
六:容器網絡nginx
七:Dockerfilec++
- 八:企業級鏡像倉庫Harbor
1. 使用最普遍的開源容器引擎 2. 一種操做系統級的虛擬化技術 3. 依賴於Linux內核特性:Namespace(資源隔離)和Cgroups(資源限制) 4. 一個簡單的應用程序打包工具
1. 提供簡單的應用程序打包工具 2. 開發人員和運維人員職責邏輯分離 3. 多環境保持一致性
1. Docker Client:客戶端 2. Ddocker Daemon:守護進程 3. Docker Images:鏡像 4. Docker Container:容器 5. Docker Registry:鏡像倉庫
1. 應用程序打包和發佈 2. 應用程序隔離 3. 持續集成 4. 部署微服務 5. 快速搭建測試環境 6. 提供PaaS產品(平臺即服務)
1. 社區版(Community Edition,CE) 2. 企業版(Enterprise Edition,EE)
1. Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu) 2. Mac 3. Windows
提供的官方網址 官方文檔:https://docs.docker.com # 安裝依賴包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker軟件包源 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安裝Docker CE yum install -y docker-ce # 啓動Docker服務並設置開機啓動 systemctl start docker systemctl enable docker
鏡像是什麼? 1. 一個分層存儲的文件 2. 一個軟件的環境 3. 一個鏡像能夠建立N個容器 4. 一種標準化的交付 5. 一個不包含Linux內核而又精簡的Linux操做系統 鏡像不是一個單一的文件,而是有多層構成。咱們能夠經過docker history <ID/NAME> 查看鏡像中各層內容及大小,每層 對應着Dockerfile中的一條指令。Docker鏡像默認存儲在/var/lib/docker/\<storage-driver\>中。
鏡像從哪裏來? Docker Hub是由Docker公司負責維護的公共註冊中心,包含大量的容器鏡像,Docker工具默認從這個公共鏡像庫下載鏡像。 地址:https://hub.docker.com/explore 配置鏡像加速器:https://www.daocloud.io/mirror curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
以下圖,容器實際上是在鏡像的最上面加了一層讀寫層,在運行容器裏文件改動時, 會先從鏡像裏要寫的文件複製到容器本身的文件系統中(讀寫層)。 若是容器刪除了,最上面的讀寫層也就刪除了,改動也就丟失了。因此不管多 少個容器共享一個鏡像,所作的寫操做都是從鏡像的文件系統中複製過來操做 的,並不會修改鏡像的源文件,這種方式提升磁盤利用率。 若想持久化這些改動,能夠經過docker commit 將容器保存成一個新鏡像。
docker info 列出當前的docker 的版本
去這裏 下載: https://download.openvz.org/template/precreated/ cat centos-6-x86_64-minimal.tar.gz |docker import - centos:6.0 ## 建立鏡像 cat centos-7-x86_64-minimal.tar.gz |docker import - centos:7.0 cat ubuntu-16.04-x86_64.tar.gz |docker import - ubuntu:16.04 另外一個種方法: docker pull nginx:1.15 docker history nignx:1.15 這個分層的下載的
建立一個容器: docker run -itd --name nginx-test -p 8080:80 nignx:1.15 docker ps -l 進入一個容器 docker exec -ti 1e9515c8c966 /bin/bash
docker commit 1e9515c8c966 nginx-test:v1 提交容器到本地倉庫
docker image nginx-test:v1 > nginx-test.tar 導出一個鏡像
docker image rm nginx-test:v1 刪掉一個鏡像
docker load -i nginx-test.tar 導入一個鏡像
docker tag nginx-test:v1 node04.flyfish/nginx/myapp:v1 給鏡像打個標籤方便提交到私有倉庫 docker images
進入一個容器: docker pull httpd docker run -tid --name httpd-test -p 4040:80 httpd docker ps -l
進入這個容器 docker ps -l docker exec -ti a30f616852a1 /bin/bash
docker run -tid --name centos7-test centos:7.0:v1 /bin/bash docker ps -a
docker run -tid --name nginx1-test1 -p 6060:80 --restart always nginx:1.15 開機自啓動 容器 (默認是docker 啓動 容器是不啓動的)
docker run -tid --name nginx2-test2 -p 7070:80 -e flyfish=zhangyy -h nginx-web --restart always nginx:1.15 指定 容器的 hostname 名稱 與 制定 環境變量 並設置開機自啓動
查看日誌 docker logs 8ea2c0ae169a -f
示例: 內存限額: 容許容器最多使用500M內存和100M的Swap,並禁用 OOM Killer: docker run -d --name nginx03 --memory 500m --memory-swap 600M --oom-kill-disable nginx:1.15 docker stats f50b08998e87
CPU限額: 容許容器最多使用一個半的CPU: docker run -d --name nginx04 --cpus="1.5" nginx:1.15 docker stats 79b51c9d4eee
容許容器最多使用50%的CPU: docker run -d --name nginx05 --cpus=".5" nginx:1.15 docker stats e70a483d0519
查看容器 docker container ls docker ps -a
進入容器執行命令: docker exec -ti e70a483d0519 /bin/bash docker exec e70a483d0519 ls
提交容器: docker commit e70a483d0519 nginx05:v1 docker images
文件拷貝到容器中 docker cp nginx-test.tar e70a483d0519:/ docker exec e70a483d0519 ls
docker logs -f 8ea2c0ae169a
查看容器的映射對外端口: docker port 8ea2c0ae169a
查看當前容器運行的主進程 docker top 8ea2c0ae169a
查看容器的是使用的資源 docker stats 8ea2c0ae169a --no-stream
刪除容器: docker rm e70a483d0519
Docker提供三種方式將數據從宿主機掛載到容器中: • volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)。保存數據的最佳方式。 • bind mounts:將宿主機上的任意位置的文件或者目錄掛載到容器中。 • tmpfs:掛載存儲在主機系統的內存中,而不會寫入主機的文件系統。若是不但願將數據持久存儲在任何位置,可使用tmpfs,同時避免寫入容器可寫層提升性能。
管理卷: # docker volume create nginx-vol # docker volume ls # docker volume inspect nginx-vol 用卷建立一個容器: # docker run -d --name=nginx3-test3 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx:1.15 # docker run -d --name=nginx3-test3 -v nginx-vol:/usr/share/nginx/html nginx1.15 清理: # docker stop nginx3-test3 # docker rm nginx3-test3 # docker volume rm nginx-vol 注意: 1. 若是沒有指定卷,自動建立。 2. 建議使用--mount,更通用。
用卷建立一個容器: # docker run -d -it --name=nginx4-test4 --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx:1.15 # docker run -d -it --name=nginx4-test4 -v /app/wwwroot:/usr/share/nginx/html nginx:1.15 驗證綁定: # docker inspect nginx4-test4 清理: # docker stop nginx4-test4 # docker rm nginx4-test4 注意: 1. 若是源文件/目錄沒有存在,不會自動建立,會拋出一個錯誤。 2. 若是掛載目標在容器中非空目錄,則該目錄現有內容將被隱藏。
Volume特色: • 多個運行容器之間共享數據。 • 當容器中止或被移除時,該卷依然存在。 • 多個容器能夠同時掛載相同的卷。 • 當明確刪除卷時,卷纔會被刪除。 • 將容器的數據存儲在遠程主機或其餘存儲上 • 將數據從一臺Docker主機遷移到另外一臺時,先中止容器,而後備份卷的目錄(/var/lib/docker/volumes/) --- Bind Mounts特色: • 從主機共享配置文件到容器。默認狀況下,掛載主機/etc/resolv.conf到每一個容器,提供DNS解析。 • 在Docker主機上的開發環境和容器之間共享源代碼。例如,能夠將Maven target目錄掛載到容器中,每次在Docker主機 上構建Maven項目時,容器均可以訪問構建的項目包。 • 當Docker主機的文件或目錄結構保證與容器所需的綁定掛載一致時
• bridge –net=bridge 默認網絡,Docker啓動後建立一個docker0網橋,默認建立的容器也是添加到這個網橋
• host –net=host 容器不會得到一個獨立的network namespace,而是與宿主機共用一個。這就意味着容器不會有本身的網卡信息,而是使用宿主機的。容器除了網絡,其餘都是隔離的。
docker run -tid --net=host busybox docker exec -ti 59a38da6c947 sh 與 宿主機共享一個網絡
• none –net=none 獲取獨立的network namespace,但不爲容器進行任何網絡配置,須要咱們手動配置。
• container –net=container:Name/ID 與指定的容器使用同一個network namespace,具備一樣的網絡配置信息,兩個容器除了網絡,其餘都仍是隔離的。
docker run -tid --net=container:nginx04 busybox docker exec -ti 4d141b2cb971 /bin/bash docker inspect 79b51c9d4eee 和nginx04 公用一個IP地址
• 自定義網絡 與默認的bridge原理同樣,但自定義網絡具有內部DNS發現,能夠經過容器名或者主機名容器之間網絡通訊。
docker network create test-nt docker run -ti --net=test-nt --name bs11 busybox 在開一個終端: docker run -ti --net=test-nt --name bs12 busybox
vim test.yaml --- FROM centos7.0:v1 MAINTAINER flyfish RUN yum install gcc -y COPY run.sh /usr/bin EXPOSE 80 CMD [「run.sh」] ---
Build鏡像 ---- Usage: docker build [OPTIONS] PATH | URL | - [flags] Options: -t, --tag list # 鏡像名稱 -f, --file string # 指定Dockerfile文件位置 # docker build . # docker build -t shykes/myapp . # docker build -t shykes/myapp -f /path/Dockerfile /path # docker build -t shykes/myapp http://www.example.com/Dockerfile
示例: touch index.html echo 11111 > index.html vim Dockerfile --- FROM centos7.0:v1 MAINTAINER flyfish RUN yum install -y httpd COPY index.html /var/www/html ENV HTTP_V=2.0 EXPOSE 80 WORKDIR /tmp CMD ["httpd","-D","FOREGROUND"] --- docker build -t httpd:v1 -f Dockerfile . docker images
構建一個nginx 鏡像: mkdir nginx cd nginx vim Docker-nginx ---- FROM centos:7 MAINTAINER flyfish RUN yum install -y gcc gcc-c++ make \ openssl-devel pcre-devel gd-devel \ iproute net-tools telnet wget curl && \ yum clean all && \ rm -rf /var/cache/yum/* RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && \ tar zxf nginx-1.15.5.tar.gz && \ cd nginx-1.15.5 && \ ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module && \ make -j 4 && make install && \ rm -rf /usr/local/nginx/html/* && \ echo "ok" >> /usr/local/nginx/html/status.html && \ cd / && rm -rf nginx-1.15.5* && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/nginx/sbin #COPY nginx.conf /usr/local/nginx/conf/nginx.conf WORKDIR /usr/local/nginx EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ---- docker build -t nginx:v1 -f Dockerfile . docker images
測試: docker run -tid --name nginx1.15-test1 nginx:v1 /bin/bash
構建一個php的鏡像 mkdir php mv Dockerfile-php php-fpm.conf php.ini php --- FROM centos:7 MAINTAINER flyfish RUN yum install epel-release -y && \ yum install -y gcc gcc-c++ make gd-devel libxml2-devel \ libcurl-devel libjpeg-devel libpng-devel openssl-devel \ libmcrypt-devel libxslt-devel libtidy-devel autoconf \ iproute net-tools telnet wget curl && \ yum clean all && \ rm -rf /var/cache/yum/* RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \ tar zxf php-5.6.36.tar.gz && \ cd php-5.6.36 && \ ./configure --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --enable-fpm --enable-opcache \ --with-mysql --with-mysqli --with-pdo-mysql \ --with-openssl --with-zlib --with-curl --with-gd \ --with-jpeg-dir --with-png-dir --with-freetype-dir \ --enable-mbstring --with-mcrypt --enable-hash && \ make -j 4 && make install && \ cp php.ini-production /usr/local/php/etc/php.ini && \ cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \ sed -i "90a \daemonize = no" /usr/local/php/etc/php-fpm.conf && \ mkdir /usr/local/php/log && \ cd / && rm -rf php* && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/php/sbin COPY php.ini /usr/local/php/etc/ COPY php-fpm.conf /usr/local/php/etc/ WORKDIR /usr/local/php EXPOSE 9000 CMD ["php-fpm"] ---- docker build -t php:v1 -f Dockerfile . docker images |grep php
一、自定義網絡 docker network create lnmp 二、建立Mysql容器 docker run -d \ --name lnmp_mysql \ --net lnmp \ --mount src=mysql-vol,dst=/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8 三、建立PHP容器 docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1 四、建立Nginx容器 docker run -d --name lnmp_nginx --net lnmp -p 88:80 \ --mount src=wwwroot,dst=/wwwroot nginx:v1 五、以wordpress博客爲例 https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
cd /var/lib/docker/volume/wwwroot/_data/ vim test.php --- <?php phpinfo();?> ---
wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz tar -zxvf wordpress-4.9.4-zh_CN.tar.gz
http://ip:88/wordpress/
FROM centos:7 MAINTAINER flyfish ENV VERSION=8.5.54 RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \ yum clean all && \ rm -rf /var/cache/yum/* RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \ #RUN wget http://192.168.31.211/apache-tomcat-${VERSION}.tar.gz && \ tar zxf apache-tomcat-${VERSION}.tar.gz && \ mv apache-tomcat-${VERSION} /usr/local/tomcat && \ rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \ mkdir /usr/local/tomcat/webapps/test && \ echo "ok" > /usr/local/tomcat/webapps/test/status.html && \ sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/tomcat/bin WORKDIR /usr/local/tomcat EXPOSE 8080 CMD ["catalina.sh", "run"]
基於鏡像 tomcat:v1 鏡像 構建一個jenkins 部署 鏡像 vim Dockerfile-jenkis --- FROM tomcat:v1 COPY jenkins.war /usr/local/tomcat/webapps/ROOT.war --- docker build -t tomcat-jenkins:v1 -f Dockerfile-jenkins .
使用tomcat-jenkins:v1 構建一個jenkins的項目 docker run -tid --name jenkins-test -p 8080:8080 --restart always -h jenkins tomcat-jenkins:v1
密碼: docker exec -ti e0edd5f81092 cat /root/.jenkins/secrets/initialAdminPassword --- 67f0ce7c72dd4fca83f8f6d047fb46de --- 下面安裝就能夠了
Habor是由VMWare公司開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的 企業級擴展,從而得到了更加普遍的應用,這些新的企業級特性包括:管理用戶界面,基於角色的訪 問控制 ,AD/LDAP集成以及審計日誌等,足以知足基本企業需求。 官方地址:https://vmware.github.io/harbor/cn/
• 在線安裝:從Docker Hub下載Harbor相關鏡像,所以安裝軟件包很是小 • 離線安裝:安裝包包含部署的相關鏡像,所以安裝包比較大 • OVA安裝程序:當用戶具備vCenter環境時,使用此安裝程序,在部署OVA後啓動Harbor
在node06.flyfish 主機上面部署 首先要安裝docker 而後 安裝 安裝docker-compose sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
# tar zxvf harbor-offline-installer-v1.5.1.tgz # cd harbor # vi harbor.cfg hostname = 192.168.100.16 ui_url_protocol = http harbor_admin_password = 12345 # ./prepare # ./install.sh
默認用戶名:admin 密碼: 12345
建立用戶 flyfish 密碼:Flyfish123
libary 添加成員 flyfish
# vi /etc/docker/daemon.json {"insecure-registries":["192.168.100.16"]} # systemctl restart docker
登陸鏡像倉庫: docker login http://192.168.100.16 用戶名:flyfish 密碼:Flyfish123
爲鏡像打一個tag 默認鏡像的提交模式是: docker tag SOURCE_IMAGE[:TAG] 192.168.100.16/library/IMAGE[:TAG] 提交模式: docker push 192.168.100.16/library/IMAGE[:TAG] ---- 將tomcat:v1 nginx:v1 php:v1 tomcat-jenkins:v1 的 鏡像提交到倉庫中: docker tag tomcat:v1 192.168.100.16/library/tomcat:v1 docker tag nginx:v1 192.168.100.16/library/nginx:v1 docker tag php:v1 192.168.100.16/library/php:v1 docker tag tomcat-jenkins:v1 192.168.100.16/library/tomcat-jenkins:v1 ----- 上傳鏡像 docker push 192.168.100.16/library/tomcat:v1 docker push 192.168.100.16/library/nginx:v1 docker push 192.168.100.16/library/php:v1 docker push 192.168.100.16/library/tomcat-jenkins:v1