安装Docker
系统环境:macOS Catalina 10.15.7
通过brew安装docker
brew install --cask --appdir=/Applications docker
直接brew install docker装上的好像不是,好像是当成了formula了。如下图
brew cask install docker直接提示命令不对,好像brew cask的安装不是这个命令格式(brew cask install xxx)了
安装好后运行上图中的命令:
docker run -d -p 80:80 docker/getting-started
学习Docker
下面对下面这个命令进行解析:
docker run ubuntu:15.10 /bin/echo "Hello world"
-
docker: Docker 的二进制执行文件。
-
run: 与前面的 docker 组合来运行一个容器。
-
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
-
/bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
教学操作:
命令行运行:
docker run -d -p 80:80 docker/getting-started
然后
本地发现没有这个image,就去download了。
可以使用 docker images查看所有镜像
发现已经下载好了docker/getting-started
然后创建一个项目,我这里是用官网的app示例。(应该是一个node.js项目)
项目中本身是没有Dockerfile的,然后我这边是想创建一个,部署好这个项目的新image。于是要新建Dockerfile文件
然后使用docker build命令
docker build -t getting-started .
该命令使用Dockerfile来构建新的容器映像。
如果只是创建了Dockerfile但是没有编辑的话,运行命令之后会报错:
编辑好Dockerfile之后运行,结果如下:
该过程下载了许多“layers”。这是因为我们指示构建者要从node:12-alpine镜像开始。但是,由于我们的计算机上没有该image,因此需要下载该image。
下载映像后,我们将其复制到应用程序中并用于yarn安装应用程序的依赖项。该CMD指令指定从该映像启动容器时要运行的默认命令。 最后,该-t参数是为了标记了该image。可以简单地将其视为最终image易于理解的名称(不知道image是不是也有个image id?反正container是有id的)。由于我们将图像命名为getting-started,因此在运行容器时可以引用该image。最后的' . '是docker build命令告诉Docker,Dockerfile的所在目录。
Dockerfile不是配置文件,他就是一个执行顺序,使用docker build的时候,会一行一行的执行Dockerfile的,这一点从上图紫色字的过程也可以看出来。
使用命令:
bytedance$ docker run -dp 3000:3000 getting-started
我们以-d“分离”模式(在后台)基于getting-started运行新容器(注意不是docker/getting-started),并在主机的端口3000和容器的端口3000之间创建一个映射。如果没有端口映射,我们将无法访问application。
这行命令返回新建的container的id。
映射之后我们就可以输入http://localhost:3000,来访问当前application了。
docker ps可以得到当前容器。
此时的docker是长这个样子的:
分别进入这两个容器可以发现
docker run是创建一个新容器并启动
docker run背后的工作:
Docker在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载启动;
利用镜像创建并启动一个容器;
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层;
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
从地址池配置一个ip地址给容器;
执行用户指定的启动命令;
执行完毕后容器被终止。
看下面这个例子:
其中,-i选项告诉Docker保持标准输入输出流对容器开放,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。
将启动命令设置为“启动一直运行的子进程”,也就是 /bin/bash
执行完这条命令后,创建并启动容器之后,执行/bin/bash,会启动一个子进程,此时父进程(也就是容器的主进程sh)会进入sleep状态,由于sleep状态不是终止状态,所以容器会继续运行。
为什么在容器中输入exit或者执行ctrl D后,容器将会终止呢,这是因为exit会退出(结束)当前进程,也就是/bin/bash,由于子进程结束,sh主进程恢复到运行态,然而由于没有命令需要继续执行,所以sh主进程结,因此容器终止。
另外一点:
启动容器之后,我们进入容器内部并在终端进行与容器交互。我们可以根据左侧的命令提示符判断自己是否在容器内部。例如上面的例子,当左侧的命令提示符为root@localhost或者电脑主机名(见下图的补充)时,表示我们在容器外部,而命令提示符为:root@3918f5e29f5b/时,表示我们在容器内部,且容器的ID是3918f5e29f5b。我们可以通过exit退出当前的容器。
使用docker start命令,使用容器名或者容器id启动一个已经终止的容器。
使用docker stop命令,用来终止一个正在运行的容器。
查看容器信息
Docker中有这样一条命令docker ps,可以查看容器的信息,包括容器ID,基础镜像,启动命令,创建时间,当前状态,端口号,容器名字。
如果执行docker ps,将会显示所有运行中的容器。
如果docker ps –a命令,可以查看Docker环境中所有的容器,包括已经停止的容器。
其他内容:
后续我们又用brew来配了一下docker内部命令的自动补全:
注意因为我们的brew是装在当前用户下的而不是root下的,所以导致当时bash_completion.d也建在了usr/local下?(我也不确定是不是这个原因,但确实下面这个命令不能用)
不能用下面这个命令:(因为没有这个目录/etc/bash_completion.d/)
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
运行会报错:
而应该用下面这种命令:
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose -o /usr/local/etc/bash_completion.d/docker-compose
就可以成功了
其实也就是可执行文件的目录让他在/usr/local/etc下
/usr/local/etc/bash_completion.d/
进入bash_completion目录看一下:
这应该是brew搞的吧?每一个从brew中下载后的,他都会加到这里面来?不然怎么没有git命令。
但是docker,brew,ssh啥的都在里面。这其中的每一个应该都是一个.sh文件?(要知道每一个.sh文件,在终端直接输入他的路径,都是可以直接运行的,比如
当然,.sh文件中第一行要加上
#!/bin/bash
)
参考链接:
https://blog.csdn.net/wenyichuan/article/details/106944276