該文章爲學習docker 筆記一
Docker 是基於GO語言實現的開源容器項目,如今主流的Linux系統都支持Docker,Docker 的構想是想要實現「Build,Ship and Run Any App, Anywhere」,即經過對應用的封裝(Packaging)、分發(Distribution)、部署(Deployment)、運行(Runtime)生命週期進行管理,達到應用組件「一次封裝,處處運行」的目的。
簡單的來講,能夠將Docker容器理解爲一種輕量級的沙盒(sandbox).每一個容器運行着一個應用,不一樣的容器相互隔離,容器之間也能夠經過網絡互相通訊。且容器的建立和中止都十分快速,幾乎跟建立和終止原生應用一致。php
mac
docker下載,官網下載太慢,網盤地址 https://pan.baidu.com/s/1i47ETj3 密碼: r76shtml
須要掛載的目錄須要在 Docker -> Preferences... -> File Sharing 添加。
windows 7 安裝 https://segmentfault.com/n/13...python
linuxmysql
sudo yum update sudo yum install docker #安裝程序將docker程序安裝到/usr/bin⺫⽬目錄下,配置⽂文件安裝在/etc/sysconfig/docker。安裝好docker以後,能夠 將docker加⼊入到啓動服務組中 sudo systemctl enable docker.service #手動啓動docker服務器,使⽤用命令 sudo systemctl start docker.service
目錄結構 github地址 https://github.com/yeyute/doc...linux
docker_lnmpr ├── mysql │ └── Dockerfile └── mysqld.cnf ├── nginx │ ├── Dockerfile │ ├── nginx.conf │ └── vhost │ └── www.texixi.com.conf ├── php │ ├── Dockerfile │ ├── composer.phar │ ├── php-fpm.conf │ ├── php.ini │ ├── redis-3.0.0.tgz └── redis └── Dockerfile └── redis.conf
# build docker build -t centos/nginx:v1.11.5 ./nginx docker build -t centos/mysql:v5.7 ./mysql docker build -t centos/php:v7.0.12 ./php docker build -t centos/redis:v3.2.6 ./redis #備註:這裏選取了172.172.0.0網段,也能夠指定其餘任意空閒的網段 docker network create --subnet=172.171.0.0/16 docker-at # run docker run --name mysql57 --net docker-at --ip 172.171.0.9 -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -v /data/logs/mysql:/var/log/mysql -v /data/run/mysqlmysqld:/var/run/mysqld -e MYSQL_ROOT_PASSWORD=123456 -it centos/mysql:v5.7 docker run --name redis326 --net docker-at --ip 172.171.0.10 -d -p 6379:6379 -v /data:/data -it centos/redis:v3.2.6 docker run --name php7 --net docker-at --ip 172.171.0.8 -d -p 9000:9000 -v /www:/www -v /data:/data --link mysql57:mysql57 --link redis326:redis326 -it centos/php:v7.0.12 docker run --name nginx11 --net docker-at --ip 172.171.0.7 -p 80:80 -d -v /www:/www -v /data:/data --link php7:php7 -it centos/nginx:v1.11.5
docker ps -a -q
這樣能夠刪除全部的容器刪除全部容器和鏡像的命令nginx
docker rm `docker ps -a |awk '{print $1}' | grep [0-9a-z]` 刪除中止的容器 docker rmi $(docker images | awk '/^<none>/ { print $3 }')
進入容器的命令git
[root@iZ287mq5dooZ nginx]# docker inspect --format "{{ .State.Pid }}" 54a454b827e5(容器ID) 20426 [root@iZ287mq5dooZ nginx]# nsenter --target 20426 --mount --uts --ipc --net --pid [root@bcb14764a7a3 /]#
# 使用官方提供的registry 鏡像來簡單的搭建本地倉庫 docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry # 標記鏡像 docker tag centos/mysql:v5.6 192.168.199.128:5000/mysql56 # 上傳鏡像 docker push 192.168.199.128:5000/mysql56 # 下載鏡像 docker pull 192.168.199.128:5000/mysql56
啓動並設置爲開機自動啓動docker服務github
[root@iZ287mq5dooZ docker-php]# docker info Cannot connect to the Docker daemon. Is the docker daemon running on this host? [root@iZ287mq5dooZ docker-php]# ps aux | grep docker root 7902 0.0 0.0 112648 956 pts/0 S+ 13:54 0:00 grep --color=auto docker [root@iZ287mq5dooZ docker-php]# service docker start Redirecting to /bin/systemctl start docker.service [root@iZ287mq5dooZ redis]# systemctl start docker
例:如下/data/run/mysql 目錄沒權限的狀況下就會出現剛纔那種狀況web
docker run --name mysql57 -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -v /data/logs/mysql:/var/log/mysql -v /data/run/mysql:/var/run/mysqld -e MYSQL_ROOT_PASSWORD=123456 -it centos/mysql:v5.7
須要注意php.ini 中的目錄對應 mysql 的配置的目錄須要掛載才能獲取文件內容,否則php鏈接mysql失敗redis
# php.ini mysql.default_socket = /data/run/mysql/mysqld.sock mysqli.default_socket = /data/run/mysql/mysqld.sock pdo_mysql.default_socket = /data/run/mysql/mysqld.sock # mysqld.cnf pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock
使用php鏈接不上redis
# 錯誤的 $redis = new Redis; $rs = $redis->connect('127.0.0.1', 6379);
php鏈接不上,查看錯誤日誌
PHP Fatal error: Uncaught RedisException: Redis server went away in /www/index.php:7
考慮到docker 之間的通訊應該不能夠用127.0.0.1 應該使用容器裏面的ip,因此查看redis 容器的ip
[root@iZ287mq5dooZ php]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5fb4b1904f1c centos/nginx:v1.11.5 "/usr/local/nginx/sbi" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, 443/tcp nginx11 2bf7ad9f44f9 centos/php:v7.0.12 "/usr/local/php/sbin/" About an hour ago Up About an hour 0.0.0.0:9000->9000/tcp php7 4b84858ea4e4 centos/redis:v3.2.6 "/bin/sh -c '\"/usr/lo" 18 hours ago Up About an hour 0.0.0.0:6379->6379/tcp redis326 158c67aa178c centos/mysql:v5.7 "docker-entrypoint.sh" 6 days ago Up About an hour 0.0.0.0:3306->3306/tcp mysql57 [root@iZ287mq5dooZ php]# docker inspect 4b84858ea4e4
結果是爲 192.168.0.4,測試鏈接,成功
$redis = new Redis; $rs = $redis->connect('192.168.0.4', 6379);
問題是重啓容器ip爲動態的,解決該問題
第一步:建立自定義網絡
#備註:這裏選取了172.172.0.0網段,也能夠指定其餘任意空閒的網段 docker network create --subnet=172.171.0.0/16 docker-at docker run --name redis326 --net docker-at --ip 172.171.0.10 -d -p 6379:6379 -v /data:/data -it centos/redis:v3.2.6
鏈接redis 就能夠配置對應的ip地址了,鏈接成功
$redis = new Redis; $rs = $redis->connect('172.171.0.10', 6379);
以上狀況雖然容器之間關聯了,可是容器之間的通信須要用搭建的網段的鏈接。
假設:只有mysql 的容器,咱們機器掛載了3306的端口,咱們本地能夠127.0.0.1去鏈接mysql容器服務
可是假設php服務也在容器裏面,這時就不能夠這麼鏈接,由於是php容器去鏈接mysql容器,因此須要一個鏈接的ip。
使用docker-compose 報錯
// 使用pip 安裝docker-compose pip install -U docker-compose
假設沒安裝pip,會報如下錯誤,windows 請參數 http://www.cnblogs.com/RSsky/...
bash: pip: command not found
linux 請執行
yum install python-pip
Docker bench,clair 等