(四)Docker安裝使用 容器

容器管理

plus:
docker本身是一個C/S架構
客戶端用於我們敲命令啊之類的
服務端提供了一些api 等 可以通過ps -ef | docker 看到服務主進程

如果要拉你在公有倉庫裏面自己倉庫裏的東西可以

docker login daocloud.io
username:
password:

基本操作

容器相關操作
docker create # 創建一個容器但是不啓動它 docker run # 創建並啓動一個容器
docker stop # 停止容器運行,發送信號SIGTERM docker kill #強制終止一個容器
docker start # 啓動一個停止狀態的容器
docker restart # 重啓一個容器
docker rmi # 刪除一個容器
docker rm $(docker ps -a -q)
docker kill # 發送信號給容器,默認SIGKILL docker attach # 連接(進入)到一個正在運行的容器 docker wait # 阻塞到一個容器,直到容器停止運行 docker --restart=always 容器
docker ps # 顯示狀態爲運行(Up)的容器
docker ps -a # 顯示所有容器,包括運行中(Up)的和退出的(Exited)
docker inspect # 深入容器內部獲取容器所有信息
docker logs -f # 查看容器的日誌(stdout/stderr)(-f 用於實時輸出)
docker events # 得到docker服務器的實時的事件
docker port # 顯示容器的端口映射
docker top # 顯示容器的進程信息
docker diff # 顯示容器文件系統的前後變化

測試

創建一個容器並啓動容器
比如:
docker run -it --name=inspect_shell centos:7 /bin/bash
創建一個名字爲inspect_shell的容器,並啓動了該容器(交互式容器)
docker run --name daemon_hello -d centos:7 /bin/bash -c "
while true;do echo hello word;sleep 1;done"
創建一個名字爲daemon_hello的容器,並啓動了該容器(後臺型容器)

數據持久化

兩種方式實現:
1.宿主機掛載點
-v
2.公用容器
--volumes-from

容器銷燬不會影響到數據卷
在集羣服務中可以通過實現宿主機存儲集羣來實現集羣數據持久化

搭建LNMP網站

1.啓動一個數據庫
docker search 去找一個你需要的版本

docker pull mysql:5.6
你可以先獲取鏡像幫助來更好的使用鏡像

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=xy123456 --name xy_mysql mysql:5.6
映射到主機3307端口  創建一個密碼爲xy123456的數據庫 容器名字爲xy_mysql 鏡像版本mysql5.6

同時 我們可以直接在真機上傳入變量到容器 獲取容器信息

docker exec  xy_mysql  sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "show databases" '

plus:這裏爲我們提供了一個一次性構建的思路

設置好mysql的密碼是什麼?創建的數據庫是什麼?要不要建立用戶?建立用戶要不要授權?
(這裏可以同構shell腳本實現 同時也有更簡單的方式 我在後面的博客中會記錄 即通過導入sql表同時修改初始化配置文件來實現)
容器中的數據文件目錄是什麼? 如何掛載來實現存儲數據的持久化?

2.創建一個php解析環境

docker run -d -  v   /var/nginx/www/html:/var/www/html -p 9000:9000 --link xy_mysql:mysql --name xy_phpfpm php:7.0-fpm 

參數說明
-d 讓容器在後臺運行
-p 添加主機到容器的端口映射
-v 添加目錄映射,即主機上的/var/nginx/www/html和容器中/var/www/html目錄是同步的
–name 容器的名字
–link 與另外一個容器建立起聯繫,這樣我們就可以在當前容器中去使用另一個容器裏的服務。

這裏如果不指定–link參數其實也是可以得,因爲容易本身也是有ip的且唯一,所以我們也可以直接利用ip去訪問容器。

然後進入到我們的容器,然後我們在/var/www/html目錄下新建一個index.php文件`

touch index.php

我們發現我們在容器裏的/var/www/html目錄中新建的文件也在主機的/var/nginx/www/html目錄中,因爲在創建容器的時候,我們已經把主機中的目錄掛載到了容器中去了。

因爲後面我要使用pdo模塊進行測試,所以我需要自己安裝pdo_mysql模塊,在docker容器中可以這樣來安裝

docker-php-ext-install pdo_mysql

然後我們可以通過命令php -m查看我們的php的所有擴展模塊,我們可以去看到我們剛剛安裝的pdo_mysql擴展也在裏面

3.搭建nginx

docker run -d -p 80:80 --name xy_nginx\ 
-v /var/nginx/www/html:/var/www/html\
--link xy_phpfpm:phpfpm --name xy_nginx nginx:1.10.3

-d 讓容器在後臺運行
-p 添加主機到容器的端口映射
-v 添加目錄映射,這裏最好nginx容器的根目錄最好寫成和php容器中根目錄一樣。但是不一點非要一模一樣,如果不一樣在配置nginx的時候需要注意
–name 容器的名字
–link 與另外一個容器建立起聯繫

然後進入nginx容器,修改nginx的配置文件讓它支持php

docker exec -ti xy_nginx /bin/bash

location ~ \.php$ {
        root           /var/www/html;
        fastcgi_index  index.php;
        fastcgi_pass   phpfpm:9000;//這裏改成我們之前--link進來的容器,也可以直接用php容器的ip
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcdi_script_name;//如果你的根目錄和php容器的根目錄不一樣,這裏的$document_root需要換成你php下的根目錄,不然php就找不到文件了
        include        fastcgi_params;                                                                                                                                               

    }

測試一波

<?php
try {
    $con = new PDO('mysql:host=mysql;dbname=test', 'xuye', 'xy123456');
    $con->query('SET NAMES UTF8');
    $res =  $con->query('select * from test');
    while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
        echo "id:{$row['id']} name:{$row['name']}";
    }
} catch (PDOException $e) {
     echo '錯誤原因:'  . $e->getMessage();
}

噹噹噹,看到正確的輸出,就證明我們的配置成功了。一個最最最基本的環境就搭建好了。。

是不是參數很多很複雜????
沒關係,後續我們可以通過docker-compose 來實現把這些參數寫在yml文件裏面 最後實現一次性構建 。

例如 :
構建node環境
node:

image: 7d10217beb82 鏡像
container_name: node 容器名
ports:                            映射端口
    - "3014:3014"
    - "3050:3050"
    - "3051:3051"
    - "8010:8010"
    - "8024:8024"
    - "3005:3005"
volumes:
    - /data/www/htdocs:/data/www 數據持久化
extra_hosts:   附加進hosts文件
    - "db.pro.com:1.1.1.1"
restart: always           自動重啓
這裏配置虛擬域名作爲項目中mysql連接地址 可以很好的避免開發環境和測試環境每次要修改連接的問題

nginx:

image: 169bd14dcf7a
container_name: nginx
links:
    - php
    - node
    - tomcat
ports:
    - "80:80"
    - "443:443"
    - "8000:8000"
volumes:
    - /data/www/htdocs:/data/www
    - /data/logs/nginx:/var/log/nginx
    - ./volumes/nginx/sites:/etc/nginx/sites-enabled
    - ./volumes/nginx/includes:/etc/nginx/includes
extra_hosts:
    - "db.pro.com:1.1.1.1"
restart: always

php:

image: 0b0b9f98dff2
container_name: php
ports:
    - "9000:9000"
links:
    - node
    - mongodb
    - redis
    - mysql           這是需要能訪問到的容器
volumes:
    - /data/www/htdocs:/data/www
    - /data/logs/php:/data/logs/php
extra_hosts:
    - "db.pro.com:119.29.105.164"
restart: always

mysql:

image: 5a58d88e1b36
container_name: mysql
ports:
    - "3306:3306"
volumes:
    - /data/db/mysql:/data/db/mysql
    - /data/logs/mysql:/data/logs/mysql
environment:
    MYSQL_USER:  "user_test"
    MYSQL_PASSWORD: "N!F3ABaFui"
    MYSQL_ROOT_PASSWORD: "T41Df!x2L4"
restart: always

redis:

image: c12f15d2ef75
container_name: redis
ports:
    - "6379:6379"
volumes:
    - /data/db/redis:/data/db/redis
    - /data/logs/redis:/data/logs/redis
restart: always

memcached:

image: 1739564665db
container_name: memcached
ports:
    - "11211:11211"
restart: always

mongodb:

image: 8e058d1bebf7
container_name: mongodb
ports:
    - "27017:27017"
volumes:
    - /data/db/mongodb:/data/db/mongodb
    - /data/logs/mongodb:/data/logs/mongodb
environment:
    AUTH: "yes" 
    JOURNALING: "yes"
    MONGODB_DATABASE: "test"
    MONGODB_USER: "test"
    MONGODB_PASS: "541R4evB"
restart: always 

最終就會一鍵構建起一套
以nginx作爲web容器 能解析php項目 訪問到node接口 後端有mysql mongo以及redis 並且數據能夠持久化保存的一套web環境

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章