Docker学习记录1

Docker的意义

对于一名程序员,为什么不熟悉下Docker呢?在我眼里,它解决了环境依赖问题。我目前所在的公司服务全部都实行容器化,每次上线都会经历代码发布、代码编译、镜像构建、先启后杀式上线服务。这让我十分好奇是如何使用docker来实现这一切流畅的操作的。

Docker for Mac Installation

参考菜鸟教程 MacOS Docker 安装

  1. 第一步当然是download 并安装运行啦在这里插入图片描述
  2. 第二步是修改下国内的镜像源
    在这里插入图片描述 在这里插入图片描述
    几个比较快的镜像源:
    1. Docker 官方中国区: https://registry.docker-cn.com
    2. 网易: http://hub-mirror.c.163.com
    3. 中科大: https://docker.mirrors.ustc.edu.cn

你还需要了解如何命令式修改镜像源(为了装逼咯)

  1. 在run的时候加上 --registry-mirror=https://docker.mirrors.ustc.edu.cn
    注:run的时候如果没有找到image,会自动pull下载
    docker run hello-world --registry-mirror=https://docker.mirrors.ustc.edu.cn
  2. 修改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
如果看到这个画面就成功了在这里插入图片描述
你需要知道的是:

  1. hello-world 是镜像名
  2. 第一次(没有本地镜像)时会先运行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需要的文件夹wwwnginx\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
  1. -p 8080:80 将容器的80端口映射到本机的8080端口
  2. --name mynginx 容器的名字叫 mynginx
  3. -v "$PWD/www":/usr/share/nginx/html 将当前目录($PWD/www)映射到容器的/usr/share/nginx/html(Nginx的默认目录)。这样nginx就在当前目录www文件夹里面读取文件啦。
    -v--volume 的简写
  4. -v "$PWD/nginx/conf.d":/etc/nginx/conf.d 将目录"$PWD/nginx/conf.d" 映射到容器的 /etc/nginx/conf.d 目录,为了覆盖容器默认的配置文件
  5. -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

  1. 添加新的命令docker run --name myphp -v "$PWD/www":/www -d php:7.1-fpm
  2. 修改 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;
        }
    }
    
  3. 修改原先的命令,把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
    
  4. 修改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扩展

  1. 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
    
  2. 创建php mysql扩展需要自建一个image
    新建一个Dockerfile

    FROM 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的安装界面了
在这里插入图片描述

一些其它的记录

  1. --link 做了什么?关于对docker run --link的理解
  2. 如何获取 docker 容器(container)的 ip 地址
  3. 在Docker里安装ping工具
    docker exec -it mynginx /bin/bash # 进入shell
    apt-get update && apt-get install iputils-ping
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值