Docker学习记录1
Docker的意义
对于一名程序员,为什么不熟悉下Docker呢?在我眼里,它解决了环境依赖问题。我目前所在的公司服务全部都实行容器化,每次上线都会经历代码发布、代码编译、镜像构建、先启后杀式上线服务。这让我十分好奇是如何使用docker来实现这一切流畅的操作的。
Docker for Mac Installation
- 第一步当然是download 并安装运行啦
- 第二步是修改下国内的镜像源
几个比较快的镜像源:- Docker 官方中国区:
https://registry.docker-cn.com
- 网易:
http://hub-mirror.c.163.com
- 中科大:
https://docker.mirrors.ustc.edu.cn
- Docker 官方中国区:
你还需要了解如何命令式修改镜像源(为了装逼咯)
- 在run的时候加上
--registry-mirror=https://docker.mirrors.ustc.edu.cn
注:run
的时候如果没有找到image,会自动pull
下载
docker run hello-world --registry-mirror=https://docker.mirrors.ustc.edu.cn
- 修改
daemon.json
文件
Mac 里文件位于~/.docker/daemon.json
{ "experimental": false, "debug": true, "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
1. Hello World
在shell里运行 docker run hello-world
如果看到这个画面就成功了
你需要知道的是:
hello-world
是镜像名- 第一次(没有本地镜像)时会先运行
docker pull library/hello-world
引用阮老师的解释:
上面代码中,docker image pull
是抓取 image 文件的命令。library/hello-world
是 image 文件在仓库里面的位置,其中library
是 image 文件所在的组,hello-world
是 image 文件的名字。
由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。docker pull hello-world
2. PHP + wordpress 走起
我看的 阮老师的教程 仿照写的,嘿嘿嘿
a. 先跑一个nginx
创建一个工作目录 demo mkdir demo
我习惯写一个shell脚本来学习,在demo里创建一个run.sh
和nginx需要的文件夹www
、nginx\conf.d\docker.conf
此时文件结构应该如下
其中nginx.conf
是nginx配置,什么?别说你不会配置,查资料去。
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
接着我们在run.sh
里面写入脚本来运行一个nginx docker吧
docker run -p 8080:80 --name mynginx \
-v "$PWD/www":/usr/share/nginx/html \
-v "$PWD/nginx/conf.d":/etc/nginx/conf.d \
-d nginx
-p 8080:80
将容器的80端口映射到本机的8080端口--name mynginx
容器的名字叫mynginx
-v "$PWD/www":/usr/share/nginx/html
将当前目录($PWD/www
)映射到容器的/usr/share/nginx/html
(Nginx的默认目录)。这样nginx就在当前目录www文件夹里面读取文件啦。
-v
是--volume
的简写-v "$PWD/nginx/conf.d":/etc/nginx/conf.d
将目录"$PWD/nginx/conf.d"
映射到容器的/etc/nginx/conf.d
目录,为了覆盖容器默认的配置文件-d
是后台运行容器
运行它: sh ./run.sh
访问游览器http://localhost:8080/
会看到
莫慌,这是因为当前www目录下什么都没有
添加文件index.html
,随便写点东西比如 Hello docker
重新访问http://localhost:8080/
你会看到
一个补充:
如果再运行一次run.sh 命令会提示如下错误
这是因为已经有了一个叫mynginx的容器存在,为了方便修改,在脚本开始先把之前的容器停止并删除。
docker container stop mynginx
docker container rm mynginx
docker run -p 8080:80 --name mynginx \
-v "$PWD/www":/usr/share/nginx/html \
-v "$PWD/nginx/conf.d":/etc/nginx/conf.d \
-d nginx
b. 启动PHP
- 添加新的命令
docker run --name myphp -v "$PWD/www":/www -d php:7.1-fpm
- 修改 nginx.conf文件
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name; include fastcgi_params; } }
- 修改原先的命令,把nginx和php链接起来
其中docker run -p 8080:80 --name mynginx \ -v "$PWD/www":/usr/share/nginx/html \ -v "$PWD/nginx/conf.d":/etc/nginx/conf.d \ --link myphp:php \ -d nginx
--link myphp:php
的作用是把myphp链接到mynginx,其中myphp别名php
最后的run.sh
脚本长这样子# 删除之前的容器 docker container stop mynginx || true docker container rm mynginx || true docker container stop myphp || true docker container rm myphp || true # 启动容器 docker run --name myphp \ -v "$PWD/www":/www \ -d php:7.1-fpm docker run -p 8080:80 --name mynginx \ -v "$PWD/www":/usr/share/nginx/html \ -v "$PWD/nginx/conf.d":/etc/nginx/conf.d \ --link myphp:php \ -d nginx
- 修改
index.html
-->index.php
,<?php phpInfo() ?>
运行sh ./run.sh
, 再次访问http://localhost:8080/
会看到以下界面
下载wordpress并解压在demo/www
下
访问http://localhost:8080/wordpress/
会出现以下错误
这是因为官方的php没有带mysql扩展。
c. 安装mysql和php mysql扩展
-
mysql安装简单,在
run.sh
里面加入docker container run -d \ --name wordpressdb \ --env MYSQL_ROOT_PASSWORD=123456 \ --env MYSQL_DATABASE=wordpress \ mysql:5.7
阮老师的解释:
--env MYSQL_ROOT_PASSWORD=123456
向容器进程传入一个环境变量MYSQL_ROOT_PASSWORD,该变量会被用作 MySQL 的根密码。
--env MYSQL_DATABASE=wordpress
向容器进程传入一个环境变量MYSQL_DATABASE,容器里面的 MySQL 会根据该变量创建一个同名数据库(本例是WordPress)。再修改下nginx的启动,把mysql网络也并进来:
docker run -p 8080:80 --name mynginx \ -v "$PWD/www":/usr/share/nginx/html \ -v "$PWD/nginx/conf.d":/etc/nginx/conf.d \ --link myphp:php \ --link wordpressdb:mysql \ -d nginx
-
创建php mysql扩展需要自建一个image
新建一个DockerfileFROM php:7.1-fpm RUN docker-php-ext-install mysqli
运行
docker image build -t phpwithmysql .
创建image
-t
用于指定image 文件的名字,最后的点表示Dockerfile文件的位置。
修改后的run.sh
长这样# 删除之前的镜像 docker image rm phpwithmysql || true # 删除之前的容器 docker container stop wordpressdb docker container rm wordpressdb docker container stop mynginx || true docker container rm mynginx || true docker container stop myphp || true docker container rm myphp || true # 构建带mysql扩展的php镜像 docker image build -t phpwithmysql . # 启动容器 docker container run -d \ --name wordpressdb \ --env MYSQL_ROOT_PASSWORD=123456 \ --env MYSQL_DATABASE=wordpress \ mysql:5.7 docker run --name myphp \ -v "$PWD/www":/www \ -d phpwithmysql docker run -p 8080:80 --name mynginx \ -v "$PWD/www":/usr/share/nginx/html \ -v "$PWD/nginx/conf.d":/etc/nginx/conf.d \ --link myphp:php \ --link wordpressdb:mysql \ -d nginx
重新运行并访问http://localhost:8080/wordpress
即可看到wrdpress的安装界面了
一些其它的记录
--link
做了什么?关于对docker run --link的理解- 如何获取 docker 容器(container)的 ip 地址
- 在Docker里安装ping工具
docker exec -it mynginx /bin/bash # 进入shell apt-get update && apt-get install iputils-ping