网络 ( Network )
Docker 中能够十分轻松的对每个容器的网络进行配置,还能在容器间建立虚拟网络,将数个容器包裹其中,同时与其他网络环境隔离。
利用一些技术,Docker 能够在容器中营造独立的域名解析环境,这使得我们可以在不修改代码和配置的前提下直接迁移容器,Docker 会为我们完成新环境的网络适配。
随便写一些开发的经验和生活的感悟
容器就是被隔离出来的虚拟环境
容器的生命周期: Created,Running,Paused,Stopped,Deleted
Running是真正在运行的容器
保持一个容器处在Running状态就需要容器中PID为1的进程一直运行着,一旦这个进程停止意味着容器的停止
容器启动进程往往由Dockerfile中最后的ENTRYPOINT或CMD决定
也就是这2选1个参数执行的shell脚本执行的程序不能报错,且必须停留在命令行上,
1 | docker create --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest |
执行 docker create
后,Docker 会根据命令使用镜像创建容器,并在控制台打印出容器 ID,此时容器是处于 Created 状态的。
我们可以用容器ID或容器name来操作容器
1 | docker start mysql |
通过 docker start
命令启动了容器
有人会说真麻烦,创建一步启动一步,下面就一键启动
看了docker start的参数发现它可以一次启动多个容器,也并非一无是处
1 | docker start [OPTIONS] CONTAINER [CONTAINER...] |
docker run
将docker create
和docker start
两步并作一步,容器创建后会立刻启动
docker run
是我们居家旅行杀人灭口必备命令,它能干的事非常多
1 | docker run [OPTIONS] IMAGE:TAG [COMMAND] [ARG...] |
保持一个容器运行不退出的必须是 ENTRYPOINT 或 CMD 占据bash不退出的命令
后台运行
后台启动一个以nginx最新版本镜像的容器,命名为mynginx
1 | docker run --name mynginx -d nginx:latest |
端口绑定
docker run 子命令启动容器,-p 将容器的 8000 端口映射到宿 主机的 8000 端口上,–name 给容器赋予一个唯一的名字, 最后一个参数是镜像
1 | docker run -p 8000:8000 --name $container_name $image_name |
交互方式运行
使用-t -i用交互方式运行
镜像名后面固定跟着的是 cmd
1 | docker run -t -i $image_name /bin/bash |
挂载目录
your_dir必须是绝对路径
1 | docker run -v /your_dir:/target_dir debian |
指定环境变量
启动一个mysql
1 | docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d -e MYSQL_DATABASE=my_database -v /your_abs_dir:/var/lib/mysql mysql:latest |
容器退出时删除数据卷
1 | docker run --name xxx --rm mysql |
通过 docker ps
可以列出Docker中的容器
1 | docker ps |
1 | docker ps -a |
通过docker ps
可以看到容器ID(CONTAINER ID),使用镜像(IMAGE),执行命令(COMMAND),创建时间(CREATED),状态(STATUS),端口(PORTS),名称(NAMES)
其中状态(STATUS)有3种状态
一般你都会看到第三种的,等你成为高手了总会是第二种,😊
1 | docker stop mysql |
容器停止后,内部被修改的内容会保留,可以通过 docker start 命令将这个容器再次启动
1 | docker pause mysql |
1 | docker top mysql |
1 | docker rm mysql |
运行中的容器是不允许被删除的,可以加参数
1 | docker rm -f mysql |
很多时候我们都想深入了解对方,是时候进入容器了
1 | # docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
1 | docker exec -it mysql /bin/bash |
有时我们需要观察容器在启动和运行过程中打印在bash上的日志
1 | docker logs CONTAINER |
成为高手后会经常查看吧,反正我没看过
1 | docker inspect CONTAINER |
专门管理容器的命令,更细化了管理能力,我就不一一翻译了
1 | Usage: docker container COMMAND |
1 | docker stop $(docker ps -a -q) |
1 | docker rm $(docker ps -a -q) |
1 | docker inspect \ |
1 | for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done |
在 Docker 体系里,有四个对象 ( Object ) ,几乎所有 Docker 以及周边生态的功能,都是围绕着它们所展开的。它们分别是:镜像 ( Image )、容器 ( Container )、网络 ( Network )、数据卷 ( Volume )
所谓镜像,可以理解为一个 只读的 文件包,其中包含了 虚拟环境运行最原始文件系统的内容
每次对镜像内容的修改,Docker 都会将这些修改铸造成一个镜像层,而一个镜像其实就是由其下层所有的镜像层所组成的。当然,每一个镜像层单独拿出来,与它之下的镜像层都可以组成一个镜像。
另外,由于这种结构,Docker 的镜像实质上是无法被修改的,因为所有对镜像的修改只会产生新的镜像,而不是更新原有的镜像。
1 | docker images |
1 | docker pull node |
1 | docker search node |
当然上面的太极客了,我一般是去Docker Hub搜索
linux 下
1 | sudo vim /etc/docker/daemon.json |
Docker Desktop直接在首选项的Daemon面板添加Registry mirrors项即可
1 | docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1 |
1 | docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] |
将指定镜像保存成tar包
1 | docker save -o my_node_v1.tar node |
只是导入
1 | docker load -i my_node_v1.tar |
1 | docker import my_node_v1.tar my_node_v1 |
1 | docker history my_node_v |
1 | docker inspect IMAGE |
通俗易懂,牛逼的在下面
1 | docker rmi IMAGE |
参见Dockerfile部分
构建镜像时产生的中间层,那些id为
1 | docker rmi $(docker images | grep "^<none>" | awk "{print $3}") |
1 | docker rmi $(docker images -q) |
利用上面每一层不可修改的特性,每次的修改会产生缓存层,在制作自己的镜像时可以加速镜像的构建
例如: 精油官网的Dockerfile
1 | FROM node:8.16.0-alpine |
执行编译结果
1 | Building webapp |
我不会去讲如何在你的对应环境中安装什么,连这个都搞不定就别看了
我们所讲的docker 是由Docker官方命名为Docker Engine的软件。这款软件最核心的部分就是docker daemon 和 docker CLI.
docker daemon 通过一套RESTful API 提供镜像 ( Image )、容器 ( Container )、网络 ( Network )、数据卷 ( Volume )的管理.
我们通过docker CLI的各种命令调用docker daemon 的RESTful API来实现管理使用docker
我们在windows或mac中直接使用Docker Desktop就可以了,你的电脑必须支持intel hyper-v技术
低版本的系统使用Docker Toolbox,当然我系统比较新从来没用过这个
1 开发
2 测试
3 部署
可以说docker是现代开发测试运维必知必会的一个环节了
年龄大了,代码写的越来越少,shell脚本写的越来越多
一直都是蒙着写,直到我知道了一款神器shellcheck来帮助我
还有vscode的插件,插件库中搜索shellcheck 安装即可
再也不怕写出得脚本有问题啦,😊
1 | # 安装 |
执行上面这些命令 mysql 就安装好了
1 | create database $database_name |
1 | # 生成 migration 文件 |
这个错误是由于没有设置密码导致的所以进入 mysql 控制台设置密码
1 | use mysql; |
现在解决上面的报错,是由于密码策略太强引起的,我们开发不需要那么强的密码策略, 继续在 mysql 控制台里修改
1 | # 查找变量,因为随着版本更迭这个变量可能会改名😭 |
下面就可以愉快的使用 mysql 了 🤣🤣🤣
但是使用了外置机械键盘 fn 键上内置键盘的功能就失效了
这个时候需要神器Karabiner来拯救我们
. 下载
. 安装
. 运行 Karabiner-Elements
. 将下面的框框取消选中
解决方法
1 | npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ |
这样使用 npm i 时会从淘宝源下载
1 | export https_proxy="http://127.0.0.1:1087" |
1.下载privoxy
1 | brew install privoxy |
2.修改/usr/local/etc/privoxy/config
搜索到“forward-socks5t /”(不含双引号)那一行,去掉注释的符号,把端口改为1086(系SS的SOCKS5端口)
forward-socks5t / 127.0.0.1:1086 .
搜索到“listen-address 127.0.0.1:8118”(不含双引号)那一行,去掉注释的符号,把127.0.0.1改为0.0.0.0(否则只能作用于本机),端口号默认或选择一个未占用的端口
listen-address 0.0.0.0:8118
3.在终端中运行
1 | cd /usr/local/sbin/ |
4.使用
将设备和Mac接入同一个局域网,并在设备的Wi-Fi设置里开启手动代理,代理服务器主机名是Mac的局域网地址,端口是刚才在config里面设置的端口号(8118)。
可以在浏览器中打开ip.cn查看当前IP,如果是SS服务器的IP,则成功。