docker初探

好吧,其实这个标题是假的。
我在不知不觉中已经用了很多次docker了。
但是docker的构建,编译和运行大部分是同事完成的。

还有很多docker的知识我还不是很懂,所以打算借此机会学习一下。
会参考一些教程网站,例如:

  1. Docker入门教程(一)介绍
  2. Docker中文社区站-Docker入门教程

首先,运行任何"docker"(容器),都需要两个步骤:

  1. 构建镜像
  2. 运行容器

整个过程可以简单地理解为写代码打包(构建镜像),双击在本地运行(运行容器)。
构建镜像可以理解为"docker"(容器)是编译型语言,类似Java,C/C++,需要先编译。
其次,编译完的可执行文件需要双击才能运行,光编译完没啥用,除了拿来发布。

镜像有什么用呢,其实就是自己打包好的环境。
现在我的笔记本(win)就因为我之前瞎鼓捣些项目,有些环境又不是很完善,整个环境有些乱了。
鼓捣完了之后,又不舍得卸载,而且还卸不干净。

如果你把你搭建好的环境打包放出去给别人下载,其他人就不用重复踩你踩过的坑了。
而且随用随下,用毕即弃。是不是听起来好像一次性餐具?但是这是电子世界,你丢弃一次性01串不会造成污染(用电的不算)。

好了,说了那么多废话,继续回到话题上来。

现在我们就先不讲构建镜像了。我们先用别人构建好的镜像。
先跑这个命令下载镜像:docker pull ubuntu
我此时下载的镜像是这样的,随版本更新,以下hash值会不一样。

Using default tag: latest
latest: Pulling from library/ubuntu
75c416ea735c: Pull complete
c6ff40b6d658: Pull complete
a7050fc1f338: Pull complete
f0ffb5cf6ba9: Pull complete
be232718519c: Pull complete
Digest: sha256:a0ee7647e24c8494f1cf6b94f1a3cd127f423268293c25d924fbe18fd82db5a4
Status: Downloaded newer image for ubuntu:latest

docker images就可以看到你下载过的镜像。

REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
ubuntu                 latest              d355ed3537e9        14 hours ago        119 MB

好,我们现在让它跑起来:docker run -it ubuntu bash
可以看到命令行变成root@4d3f61c27b6c:/#了。
这个时候,你可以敲任何ubuntu命令了。

这条命令的意思是,在ubuntu这个镜像上run(运行)bash这条命令。
-it呢,等于-i -t
-i就是Keep STDIN open even if not attached,就是交互模式。
-t就是Allocate a pseudo-TTY,分配一个虚拟TTY?
-t参数模拟ssh登陆容器(这个描述应该不准确),然后用-i参数来接受来自用户的输入`。

我尝试了一下,如果只有-i参数,那它会啥都不输出。
虽然是交互模式,但是没有tty,所以输出内容不会传输过来到宿主机。
如果只有-t参数,虽然有输出,但是无法接收来自用户的输入。
但是-it(或者-ti)就即能接收用户的输入,也可以显示容器的输出(这个描述应该也不准确)。

你大概已经折腾了一天,该睡觉了吧?
在linux里敲exit就可以退出bash。

咦?那我明天也运行docker run -it ubuntu bash就好了吗?
你可以试试啊~进入linux后,你会发现你昨天做的改动都没有了。
机子名也变了。敲exit退出。

在宿主机(安装了docker的机子)敲docker ps -a就可以看到,我们刚刚运行的容器已经结束了。

λ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
0e152599996f        ubuntu              "bash"              45 seconds ago      Exited (0) 1 second ago                        naughty_wilson
4d3f61c27b6c        ubuntu              "bash"              3 minutes ago       Exited (0) 2 minutes ago                       happy_shockley

这里的-a表示all,不带-a的情况下,只会显示正在运行的容器。

如果要它一直运行下去的话怎么办?
这里就先留个问题给读者。(其实是我要睡觉了)

格式化所有项目里的所有php文件

  1. 先列出所有php文件,保存到php.txt中。git ls-files |grep \.php$ > php.txt
  2. phpfmt插件目录拷贝fmt.phar到项目根目录。
  3. 保存一下文件为format.sh
#!/bin/bash
while IFS= read -r file
do
    [ -f "$file" ] && php fmt.phar --psr2 --smart_linebreak_after_curly "$file" #php-cs-fixer fix --rules=@PSR2,-phpdoc_align,@Symfony,-unary_operator_spaces --rules='{"concat_space":{"spacing":"one"}}' "$file"
done < "./php.txt"
  1. bash format.sh就好了。

用startssl生成的证书配置nginx的https

  1. 生成rsa密钥对,openssl genrsa -aes256 -out my-private-encrypted.key 2048
  2. openssl rsa -in my-private-encrypted.key -out my-private-decrypted.key(建议chmod 600 my-private-decrypted.key)
  3. openssl req -new -sha256 -key my-private-decrypted.key -out mydomain.com.csr
  4. 粘贴csr到startssl
    屏幕快照 2017-03-08 上午10.21.48.png
  5. 然后下载文件,并上传到服务器中。
    屏幕快照 2017-03-08 上午10.23.10.png
  6. 在服务器上,刚刚上传文件的地方,下载sub.class1.server.sha2.ca.pem
    wget https://www.startssl.com/certs/class1/sha2/pem/sub.class1.server.sha2.ca.pem
  7. 把两个文件合并到一起(不知道为什么要这样做,大概是为了方便引用?)
  8. sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
  9. 修改nginx配置文件
server {
        listen 80;
        listen [::]:80;
        server_name test.skys215.com;
        return 301 https://$host$request_uri;
}

server{
        listen 443 ssl;
        server_name test.skys215.com;

        ssl on;
        ssl_certificate /path/to/unified.crt;
        ssl_certificate_key /path/to/my-private-decrypted.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;

        root /var/www/test;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }
}
  1. 访问https://www.ssllabs.com/ssltest/analyze.html?d=test.skys215.com
    屏幕快照 2017-03-08 上午11.36.11.png

如果结果是A+那就可以了~

但是,starcom签发的证书已经被chrome和firefox标为不受信任的证书提供商。用以上浏览器打开会显示为不安全。