云原生 | Docker 初探
安装与配置
Ubuntu环境
-
拉取镜像太慢,配置镜像加速
-
vim /etc/docker/daemon.json
对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
可以添加多个
南京大学:https://docker.nju.edu.cn/ (好用) 科大镜像:https://docker.mirrors.ustc.edu.cn/ 网易:https://hub-mirror.c.163.com/ 阿里云:https://<你的ID>.mirror.aliyuncs.com 七牛云加速器:https://reg-mirror.qiniu.com https://hub-mirror.c.163.com https://docker.m.daocloud.io https://ghcr.io https://mirror.baidubce.com
重新启动
$ sudo systemctl daemon-reload $ sudo systemctl restart docker
Mac环境
直接使用brew安装cask
brew install --cask docker
会下载桌面版本的docker,之后按照提示运行即可
初步了解
镜像:类似于虚拟机的镜像,提供执行环境,比如go语言的镜像,就是提供go语言的运行环境
容器:镜像通过执行run
方法可以得到一个容器,比如是ubuntu
环境,可以在容器里安装RabbitMQ
,ES
环境。
仓库:拉取镜像的地方
Dockerfile
:文本文件(脚本),包含很多执行指令,用于构建自己的镜像,可用于扩展官方镜像。相当于docker image build
的构建镜像的源代码
从仓库(一般为DockerHub
)下载(pull)一个镜像,Docker
执行run
方法得到一个容器,用户在容器里执行各种操作。Docker执行commit方法将一个容器转化为镜像。Docker
利用login
、push
等命令将本地镜像推送(push
)到仓库。其他机器或服务器上就可以使用该镜像去生成容器,进而运行相应的应用程序了。
镜像 Image 和 容器 Container 指令
镜像image相关
-
docker build
-
docker image pull
拉取镜像 -
docker images
本地存储的Docker镜像 -
docker images --all
全部镜像 包括中间层镜像和未被标记的镜像 -
docker rmi <IMAGEID>
删除镜像,如果该镜像被容器引用了不能完全删除,需要先删除容器 -
docker create -it <镜像名>
通过镜像创建container -
docker run -it <镜像名>
通过镜像创建并运行container-p 8080:8080
-p表示端口映射,格式:宿主机端口:容器运行端口
-e MYSQL_ROOT_PASSWORD=123456 mysql
-e表示添加环境变量,这里是mysql的密码。--name <name>
将容器命名为 -
push到dockerhub
docker login
登录dockerhub账号docker push <imageName>
容器container相关
-
docker ps
查看正在运行的容器 (docker container ls
) -
docker ps -a
查看已经退出的容器 (docker container ls --all
) -
docker run -d -it --name centos.7.2 centos:7
-d在后台运行 -t 是保持stdout以及分配终端-i
进入container内部只用
-i
参数时,由于没有分配伪终端,但命令执行结果仍然可以返回。 -
docker exec -it 容器名称 (或者容器ID) /bin/bash
不会将终端附加到容器中,而是在当前终端中打开一个新的终端会话。在宿主机上进入容器,登录守护式容器
-
docker attach
指令用于附加到正在运行的容器上。在容器内执行的命令和输出将被显示在当前终端上,类似于使用 SSH 连接到远程服务器并在其上运行命令。exit
退出 -
docker logs 镜像名
查看日志 -
docker container kill id
杀死正在使用的container -
docker start/stop <CONTAINERID>
启动刚create的或者已经停止的container -
docker (container) rm id
删除使用完的container 防止占用内存 -
docker container prune
清理所有处于终止状态的容器 -
docker network create test-network
容器通信–network 名字
-
docker export f299f501774c > halo.tar
导出容器成tar
文件 -
docker import - image-name < halo.tar
导入tar
文件成镜像
数据卷相关
数据卷
是一个可供一个或多个容器使用的特殊目录,可以在容器之间共享和重用,数据卷
默认会一直存在,即使容器被删除
-
docker volume ls
查看所有的数据卷 -
创建一个数据卷
docker volume create my-vol
-
docker volume inspect my-vol
在主机里使用以下命令可以查看指定数据卷
的信息 -
--mount source=my-vol,target=/usr/share/nginx/html
。启动一个挂载数据卷的容器创建一个名为
web
的容器,并加载一个数据卷
到容器的/usr/share/nginx/html
目录docker run -d -P --name web --mount source=my-vol,target=/usr/share/nginx/html nginx:alpine # -v my-vol:/usr/share/nginx/html
-
docker inspect web
查看数据卷的具体信息 -
docker rm volume web
删除docker volume prune
删除所有
Dockerfile
实例
FROM golang:lasest
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o main
RUN mkdir publish \
&& cp main publish \
&& cp -r conf publish
# 指定运行时环境变量
ENV GIN_MODE=release
EXPOSE 3000
ENTRYPOINT ["./main"]
ADD和COPY命令
COPY
指令将从构建上下文目录中 <源路径>
的文件/目录复制到新的一层的镜像内的 <目标路径>
位置。比如:
COPY package.json /usr/src/app/
ADD
指令和 COPY
的格式和性质基本一致。但是在 COPY
基础上增加了一些功能。
- 源文件如果是
url
会自动下载文件,如果文件是压缩包需要通过RUN指令来解压 - 如果源文件是压缩包,会自动解压缩
CMD
和ENTRYPOINT
命令
CMD
指令就是用于指定默认的容器主进程的启动命令的。有exec
和shell
两种格式
ENTRYPOINT
指令与CMD
指令非常类似。
但是CMD
指令会在启动容器时被覆盖, ENTRYPOINT
指令提供的命令则不容易在启动容器时被覆盖。实际上,docker run
命令中指定的任何参数都会被当做参数再次传递给ENTRYPOIINT
指令中指定的命令。
curl -i
ls -l -a
评论区