简单粗暴的安装
学习任何一个新技术,我都推荐在虚拟机里面去操作,毕竟环境干净搞完蛋不影响原来的操作系统。
依赖
1 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
添加 Docker 源
1 | sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
安装
1 | sudo yum install docker-ce docker-ce-cli containerd.io --nobest |
启动 Docker CE
1 | sudo systemctl enable docker |
2 | sudo systemctl start docker |
建立用户组
一般我们不会直接用root
这个大权限的用户来操作,一般需要建立一个组加入docker
组:
1 | sudo groupadd docker |
将当前用户加入 docker
组
1 | sudo usermod -aG docker $USER |
忒出当前客户端重新登录,进行下面的测试
Docker 镜像
由于某些原因,我们访问外网很慢,甚至是无法访问,好在有大厂这个镜像,所以赶紧换之。
新建一个配置文件/etc/docker/daemon.json
1 | vi /etc/docker/daemon.json |
输入以下内容:
1 | { |
2 | "registry-mirrors": [ |
3 | "https://dockerhub.azk8s.cn", |
4 | "https://hub-mirror.c.163.com" |
5 | ] |
6 | } |
改完一定要重启!改完一定要重启!改完一定要重启!
1 | sudo systemctl daemon-reload |
2 | sudo systemctl restart docker |
测试 Docker 是否安装成功
执行以下命令:
1 | docker run hello-world |
输出:
1 | Hello from Docker! |
2 | This message shows that your installation appears to be working correctly. |
3 | |
4 | To generate this message, Docker took the following steps: |
5 | 1. The Docker client contacted the Docker daemon. |
6 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. |
7 | (amd64) |
8 | 3. The Docker daemon created a new container from that image which runs the |
9 | executable that produces the output you are currently reading. |
10 | 4. The Docker daemon streamed that output to the Docker client, which sent it |
11 | to your terminal. |
12 | |
13 | To try something more ambitious, you can run an Ubuntu container with: |
14 | $ docker run -it ubuntu bash |
15 | |
16 | Share images, automate workflows, and more with a free Docker ID: |
17 | https://hub.docker.com/ |
18 | |
19 | For more examples and ideas, visit: |
20 | https://docs.docker.com/get-started/ |
看到这个就证明 docker
已经 OJBK 了。
Docker 搭建 Swoole PHP 开发环境
我选择的是一个官方源 php:7.4-cli
,里面扩展还不是很全,但是后期可以通过 docker-php-ext-install
进行安装。
1 | docker run -dit --name myswoole php:7.4-cli bash |
这里我们来解析下相关的命令
run 运行一个容器
-d 让 docker 进入后台运行
-t 终端
-i 交互式操作
–name 将这个容器命名为
myswoole
,这里的命名自行定义就好了php:7.4-cli
这里是我选择的源bash 这里表时交互使用的 shell
输入这个命令后,你会看到一段 hash
,然后就是没有任何反应了。其实这里容器已经启动了,速度真的是杠杠的,我们可以通过以下命令去查看这个命令。
1 | docker ps |
这个命令会列出所有正在运行的容器进程:
1 | CONTAINER ID IMAGE COMMAND ...NAMES |
2 | 90558d9a592b php:7.4-cli "docker-php-entrypoi…" ...myswoole |
好了,既然容器有了,我们就要进入容器通过命令行操作他了。
1 | 进入名为 myswoole 容器的bash |
2 | docker exec -it myswoole bash |
3 | |
4 | 进入命令行后 |
5 | 升级我们的依赖 |
6 | 默认的这个源没有vim,我会选择自己安装 |
7 | 因为Swoole需要使用到libssl-dev扩展 |
8 | apt update |
9 | apt install vim libssl-dev |
10 | |
11 | 通过 pecl 安装 swoole |
12 | pecl install swoole |
13 | |
14 | 具体socket openssl http2 mysqlnd 是否安装你自己选择 |
15 | |
16 | 安装完通过以下命令,获取扩展配置路径 |
17 | php --ini |
18 | |
19 | cd /usr/local/etc/php/conf.d/ |
20 | vi swoole.ini |
21 | |
22 | 输入 extension=swoole.so |
23 | 保存退出 |
24 | 查看已经有swoole扩展了 |
25 | php -m |
此时已经安装完毕,我们退出 bash
。这个容器已经改变,我们需要保存这个容器的修改。这里我们需要使用docker commit
命令。
首先我们通过docker ps
命令获取运行容器列表
1 | docker ps |
2 | |
3 | CONTAINER ID IMAGE COMMAND ...NAMES |
4 | 90558d9a592b php:7.4-cli "docker-php-entrypoi…" ...myswoole |
这里容器的hash
值为90558d9a592b
,我们要保存的就是这个容器,所以需要这个 hash
1 | 保存这个hash值对应的容器的修改 |
2 | docker commit 90558d9a592b myswoole:php7.4-cli |
3 | |
4 | 我们的 image 里面就多了 myswoole 了 |
5 | docker images |
6 | |
7 | REPOSITORY TAG IMAGE ID CREATED SIZE |
8 | myswoole php7.4-cli 44a70414dc94 6 seconds ago 489MB |
9 | myphp 7.4-cli 95e2af34d266 About an hour ago 627MB |
10 | ubuntu 18.04 4e5021d210f6 5 days ago 64.2MB |
11 | php 7.4-cli 040c7fa6ecb6 6 days ago 405MB |
既然镜像已经保存,那么我们就要停止他,我们需要绑定本地的文件夹到容器里面,方便容器运行swoole
程序。
1 | docker ps |
2 | docker stop 90558d9a592b |
3 | 这个时候我们需要调整 |
4 | docker run -dit --name myswoole -p 80:3000 -v "$PWD":/usr/src/myapp -w /usr/src/myapp myswoole:php7.4-cli php index.php |
命令分析:
- -dit 表时后台运行交互终端
- –name 命名容器名称为 myswoole
- -p 80 端口和容器的 3000 端口绑定
- -v 映射本地当前工作目录到容器的
/usr/src/myapp
目录中 - -w 容器内的目录路径
执行命令,这里我们会发现报错了
1 | docker: Error response from daemon: Conflict. The container name "/myswoole" is already in use by container "90558d9a592bddb6e94288b2ae4297448fb3094509696290d36fe6d1e268c4ce". You have to remove (or rename) that container to be able to reuse that name. |
2 | See 'docker run --help'. |
提示我们这个容器已经存在相同的名称了,不慌简单粗暴干掉他们就好了。
1 | docker ps -a |
2 | |
3 | # 输出 |
4 | CONTAINER ID IMAGE COMMAND ...NAMES |
5 | 90558d9a592b php:7.4-cli "docker-php-entrypoi…" ...myswoole |
6 | |
7 | # 开干 |
8 | docker rm 90558d9a592b |
9 | |
10 | # 再次执行命令 |
11 | docker run -dit --name myswoole -p 80:3000 -v "$PWD":/usr/src/myapp -w /usr/src/myapp myswoole:php7.4-cli php index.php |
在容器绑定的 “$PWD” 目录下创建一个index.php
1 |
|
2 | $http = new Swoole\Http\Server("0.0.0.0", 3000); |
3 | |
4 | $http->on('request', function ($request, $response) { |
5 | $response->header("Content-Type", "text/html; charset=utf-8"); |
6 | $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>"); |
7 | }); |
8 | |
9 | $http->start(); |
在容器中执行 php index.php
,然后我访问 本机地址的 80 端口。输出成功。这里只是单个程序的 Docker 学习,还有组合后面抽时间写。