首頁>技術>

六、Docker 容器的基本操作

1、如下圖,在 windows shell 中使用 docker-compose up -d mysql nginx 命令,可以啟動容器,並會啟動相關聯的容器。啟動之後一個基本的 LNMP 環境就構建完成了。

使用 docker-compose ps 可以檢視所有容器,如上圖,可以看到,beanstalkd 和 redis 在 state 狀態是 Exit ,也就是沒有啟動。所以,想使用哪個服務就啟動哪個容器。最後的 Ports 埠號是 宿主機的埠對映到容器的埠,比如,瀏覽器訪問 http://127.0.0.1 ,宿主機( Win10 ) 的80埠就會對映到 nginx 容器的 80 埠,這樣就由 nginx 提供服務了。

2、進入相應的容器就相當於進入了 Linux 系統環境,比如進入 Workspace 容器就可以執行( Artisan, Composer, PHPUnit, Gulp, ... )等命令,進入 mysql 容器,可以登入 mysql 命令列。

如上圖,進入 nginx 容器 bash 後,就可以執行 Linux 命令了,執行 nginx -V 檢視版本,可以看到版本號及編譯引數,比如,已經啟用了 ssl 、gzip、 http_v2 等功能模組。最後用 exit 退出 Linux bash 環境。

docker-compose exec workspace bash // 進入workspace 容器bashdocker-compose exec mysql bash // 進入 mysql 容器 bashdocker-compose exec nginx bash  // 進入 nginx 容器 bash###顯示結果###bash-4.4#

Windows PowerShell 使用者執行以下命令以進入任何正在執行的容器:

# docker exec -it {workspace-container-id} bash

每一個容器就相當於類似於沙箱一樣的互相隔離的一個 Linux 系統,比如 nginx 容器就是一個 Linux + nginx 系統,而 mysql 容器是另一個 Linux + mysql 系統,兩個容器之間是隔離的,不會互相影響,每個容器都有一個 Docker 統一分配的區域網 IP 地址。進入容器之後 bash ,可以執行基本的 Linux 命令,比如檢視容器的ip地址:

# cat /etc/hosts

3、為了區別 Windows PowerShell 和 容器 base 環境,可以約定:如果命令列前是 > 符號,就表示要在 Windows PowerShell 中執行;如果命令列前是 # 符號,就表示在 Linux base 環境中執行。

4、如果在安裝時沒有修改 .env 檔案,按預設沒有安裝 Xdebug ,要重新配置啟用 Xdebug 的話,可以按前面 五、安裝 Laradock 中的第3條方法修改 .env 檔案,修改完成後,執行命令 > docker-compose build workspace php-fpm 重新構建容器,所需時間和第一次安裝時一樣。

5、一般在修改 nginx 配置後,需要重啟 Docker 的 Nginx:

> docker-compose up -d nginx###顯示結果###laradock_docker-in-docker_1 is up-to-dateRecreating laradock_workspace_1 ... doneRecreating laradock_php-fpm_1   ... doneRecreating laradock_nginx_1     ... done

6、進入 workspace 容器 base ,使用國內的 composer 映象,詳見:https://pkg.phpcomposer.com/

docker-compose exec workspace bash composer config -g repo.packagist composer https://packagist.phpcomposer.com
七、mysql8.0 無法連線問題

1、使用docker-compose up命令執行phpMyAdmin容器

# use with mysqldocker-compose up -d mysql phpmyadmin

2、開啟瀏覽器並通過埠8080訪問本地主機:http://localhost:8080 ,伺服器:mysql, 使用者名稱:root,密碼:root 登入

3、如果宿主機安裝了 Navicat 之類的資料庫管理軟體,主機地址使用 127.0.0.1 ,就可以連線 mysql 數制庫。

4、但是在 mysql8.0 時,這些資料庫管理軟體還不支援,可能會報錯:

mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client

這是因為 mysql 8.0 將密碼驗證方式由以前的 mysql_native_password 改為了 caching_sha2_password 。可以進入 mysql 容器 bash,登入 mysql ,將驗證方式修改成原來的。

#在docker-compose exec mysql bashmysql -uroot -pmysql> grant all PRIVILEGES on *.* to root@'%' WITH GRANT OPTION;mysql> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';mysql> ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';mysql> FLUSH PRIVILEGES;mysql> exit;

現在就可以用 root 登入了。為了使新建使用者的驗證方式預設為 mysql_native_password ,可以修改 my.cnf 檔案,在 [mysqld] 部分中新增:

default_authentication_plugin = mysql_native_password

5、laradock 預設裝的是 mysql 最新版本(mysql8),也可以更換成低版本的 mysql 。

# 修改 .env 檔案MYSQL_VERSION=5.7 # 預設為 latest#停止mysql容器docker-compose stop mysql# 刪除舊資料庫資料rm -rf ~/.laradock/data/mysql# 重新構建新 mysqldocker-compose build mysql # 重新建立容器docker-compose up -d nginx mysql# 檢視現有 mysql 版本docker inspect laradock_mysql_1

6、在 php 程式中連線資料庫時,如果 DB_HOST 為 127.0.0.1 或 localhost,則會報錯:SQLSTATE[HY000] [2002] Connection refused ,SQLSTATE[HY000] [2002] No such file or directory,那時因為 php 容器裡是沒有 mysql 的,需要用 mysql 容器的 IP。

八、專案配置

1、以安裝和配置一個 Laravel 專案為例,在 PowerShell 中首先進入 Laradock 目錄,啟動容器:

docker-compose up -d mysqldocker-compose up -d nginx###輸出內容###laradock_mysql_1 is up-to-datelaradock_docker-in-docker_1 is up-to-datelaradock_workspace_1 is up-to-datelaradock_php-fpm_1 is up-to-datelaradock_nginx_1 is up-to-date
docker-compose up -d redis beanstalkd phpmyadmindocker-compose up -d phpmyadmin

注意:預設情況下,docker會使用 bridge 網路模式為每一個啟動的容器動態分配一個IP,以172.17.0.1為閘道器,172.17.0.2,172.17.0.3 依次類推作為容器的 ip,但是如果下次啟動時容器啟動順序有變化,可能分配的 IP 地址也會變化,並且有些容器之間互相有依賴,所以最好按順序依次啟動,不要包含在一條 docker-compose up 命令中,這樣當下次啟動多個容器的時候 IP 還是會分配和上次相同的 IP。

2、進入 workspace 容器

docker-compose exec workspace bash###輸出內容###root@5f056ea61aed:/var/www#

輸出內容可以看到容器中預設目錄是 /var/www 目錄,這個目錄預設是和 win10 中 Laradock 同級目錄建立的軟連結。

ps:如果要修改這個預設的軟連結目錄,可以先在 laradock 父級目錄下建立一個與 laradock 同級的 wwwroot 目錄,然後編輯 laradock 目錄下 .env 檔案中的 APPLICATION 配置項:

APPLICATION=../wwwroot/

再重新載入容器,這樣就相當於為 win10 中的 wwwroot 目錄與 Docker 的 /var/www 目錄建立了軟連結

4、在 workspace 容器的 bash 中,首先要確定是否已啟用用 composer 國內映象,參見上述 六.6 ,然後執行 composer 命令建立一個 Laravel 專案:

composer create-project laravel/laravel larabbs --prefer-dist

在 win10 中的目錄結構如下:

+laradock+laravel

在 win10 中的 laravel 目錄,就相當於 workspace 中的 /var/www 目錄。

5、在win10中開啟 laradock/nginx/sites 目錄,複製一份 laravel.conf.example ,重新命名為 larabbs.conf 並編輯此檔案:

server_name larabbs.test;root /var/www/laravel/public;index index.php index.html index.htm;

重新啟動 laradock_nginx 容器,也就是重啟 nginx 伺服器

docker restart laradock_nginx_1

6、開啟 C:\\Windows\\System32\\drivers\\etc 目錄,編輯 hosts 檔案,新增:127.0.0.1 laravel.test

7、開啟瀏覽器,訪問 http:// laravel.test ,即可看到 laravel 框架預設首頁。

8、使用 Navicat ,或 phpMyAdmin ,新建資料庫 test_laravel ,字元及排序規則選:utf8mb4_unicode_ci

9、進入 mysql 容器,查詢容器的 ip 地址。如本例:172.19.0.2 即為 php 專案連線資料庫的地址。

> docker-compose exec mysql bash# cat /etc/hosts***顯示結果***127.0.0.1       localhost::1     localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.19.0.2      973c5c774036

退出容器 bash

# exit***顯示結果***exitPS C:\\WWW\\laradock>

10、用 phpstrom 或別的編輯器,開啟 Laravel 專案,編輯 .env 配置檔案,DB_HOST 為上一步查詢到的 IP 地址:

APP_URL=http:// laravel.test...DB_CONNECTION=mysqlDB_HOST=172.19.0.2DB_PORT=3306DB_DATABASE=test_laravelDB_USERNAME=rootDB_PASSWORD=root

11、至此,專案配置完成!

附:一、安裝 cmder

1、win10 中將 cmder 放在C:\\Program files\\ 目錄下時有許可權問題。2、360防毒會誤殺,要將 cmder/vendor/init.bat 到360防毒的 設定->檔案白名單 中,在彈出攔截視窗時點選加入白名單無效,要手動加入。

二、Docker 常用命令

切換到 laradock 目錄執行:

進入容器:docker-compose exec{容器名}bash 預設是使用 root 使用者進入,議不要採用root進入,因為composer不推薦

用 laradock 使用者進入容器:docker-compose exec —user=laradock workspace bash

退出命令是 : exit。

進入 mysql 容器: docker-compose exec mysql bash

在 mysql 容器 bash 中,進入mysql 命令列: mysql -uroot -proot

進入 workspace 容器:docker-compose exec workspace bash ,這是 laradock 的 docker 的工作空間

檢視容器啟動狀態:docker-compose ps

關閉所有容器:docker-compose stop

關閉指定容器:docker stop CONTAINER ID或者NAMES

重新啟動容器:docker start CONTAINER ID或者NAMES

重啟 nginx 容器:docker-compose restart nginx

殺死所有正在執行的容器:docker kill $(docker ps -a -q)

檢視本地映象:docker images

檢視本地容器:docker ps

建立映象:docker build -t name:tag Dockerfile路徑

進入容器:docker exec-it IMAGE ID或者NAMES /bin/bash

移除本地容器:docker rm CONTAINER ID或者NAMES

檢視openssl版本號:openssl version

檢視 nginx 的版本及編譯引數: nginx -V

三、win10 中 docker 執行程式載入速度慢的問題

docker 在win10掛載目錄 IO 速度慢,導致 laravel 程式載入速度慢,說明及解決方法見以下兩個連結:

https://github.com/docker/for-win/issues/188

-- END --

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 用Google CodeLab構建自己的程式碼教學課程