Docker 是一个用Go语言实现的开源应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后运行到任何安装了 docker 的服务器上,达到一次构建,多次复用。
一、安装
1. 软件安装
Windows 和 MacOS 分别前往Docker Desktop for Windows和Docker Desktop for Mac下载安装。
Linux 系统使用官方的一键安装命令
1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun |
若非root用户,可执行命令将当前用户加入 docker
组,而后重新登录ssh即可
1 | sudo usermod -aG docker ${USER} |
2. 配置国内源
桌面版打开设置面板-Docker Engine
进行设置保存,linux下编辑/etc/docker/daemon.json
文件保存并重启服务
1 | { |
3. 配置代理
由于不可抗力,有时国内源无法使用,此时就需要为docker配置代理。
在执行 docker pull
时守护进程dockerd来执行,因此代理需要配在dockerd的环境中。
1 | sudo mkdir -p /etc/systemd/system/docker.service.d |
并填入以下内容,其中 192.168.1.1:7890
请替换为你自己的代理。
1 | [Service] |
而后重启即可
1 | sudo systemctl daemon-reload |
二、镜像
镜像对于docker来说有点类似于windows的exe文件或mac的app应用程序,将程序执行环境都打包成了镜像,当需要运行时,只需要将镜像放于任意需要运行的服务器上运行即可
1. 查看镜像
1 | docker images |
2. 删除镜像
删除可根据名称:版本号
或镜像id删除
1 | docker rmi nginx:latest |
3. 查找镜像
查询有哪些可用镜像可执行查询命令,该命令会查询docker公共仓库
1 | docker search nginx |
或前往dockerHub直接搜索
4. 镜像仓库
除了docker的公共仓库外,我们还可以搭建私有仓库,或使用阿里云等其他服务提供的镜像仓库,非公共仓库与公共仓库从镜像名很容易就能看出区别,例如
镜像名 | 仓库地址 | 所属用户 | 镜像 | 标签/版本号 |
---|---|---|---|---|
nginx | docker.io | 官方 | nginx | latest |
nacos/nacos-server:v2.1.2 | docker.io | nacos | nacos-server | v2.1.2 |
seepine/alpine:openjdk8 | docker.io | seepine | alpine | openjdk8 |
registry.cn-hangzhou.aliyuncs.com/seepine/mysql:8.0 | registry.cn-hangzhou.aliyuncs.com | seepine | mysql | 8.0 |
5. 拉取镜像
拉取镜像不指定版本时,默认拉取nginx:latest
,也可手动指定镜像版本号
1 | docker pull nginx |
6. 构建镜像
当我们需要的镜像别人未提供,或我们需要定制镜像时,就需要编写 Dockerfile
手动构建镜像。
以SpringBoot
为例构建为镜像,在项目根目录中准备 Dockerfile
文件并编写如下内容
- 表示基于
seepine/alpine:openjdk8
镜像 - 在此基础上创建工作目录
workspace
- 并将本地打包后的
jar
包拷贝到镜像中为/workspace/application.jar
- 最终执行命令
java -jar application.jar
启动应用
1 | FROM docker.io/seepine/alpine:openjdk8 |
此时在终端中执行jar构建出需要的jar包后
1 | ./gradlew bootJar |
再执行构建镜像命令即可构建出镜像 seepine/springboot-test:v1.0
1 | docker build -t seepine/springboot-test:v1.0 . |
关于 Dockerfile
更多规则可查看官方文档DockerfileDoc
7. 推送镜像
镜像构建后只存在于你本地,需要将镜像推送到镜像仓库中,其他服务器上才能拉取得到你构建的镜像 ,推送到镜像仓库根据你构建时镜像名称,并且推送前需要先执行docker login
或docker login registry.cn-hangzhou.aliyuncs.com
进行登录,否则会无推送权限
1 | docker push seepine/springboot-test:v1.0 |
三、容器
镜像运行之后就会变为容器,因此可知,同一个镜像是可以运行多次,变为多个容器,并且每个容器直接默认都是相互隔离的,有独立的环境、独立的ip、独立的端口等
1. 查看容器
1 | docker ps |
2. 运行容器
执行以下命令即可运行一个容器(当镜像不存在时会自动拉取镜像),并可看到运行日志,但此时我们无法访问,因为容器是独立的
1 | docker run nginx |
通过 -p
参数将容器的端口映射到本机端口,此时通过本机ip:port
即可访问到容器
1 | docker run -p 8080:8080 nginx |
3. 进入容器
有时我们不仅仅需要运行容器,还需要进入容器内修改某些文件,可使用命令进入到容器内部
1 | docker exec -it c01701b64b4b sh |
4. 挂载目录
我们运行的容器都是一次性的,即当我们进入容器内修改了文件后,当容器重启后,一切文件将会复原到容器镜像最初的样子,因此我们可以使用 -v
将容器内某些目录挂载出来,实现持久化。
例如以下命令,表示将容器的 /usr/share/nginx/html
目录,挂载到本机的 /root/data
目录,此时不需要进入到容器内,直接修改本机的 /root/data
目录中的文件即可生效,并且容器重启后文件依然存在。
1 | docker run -p 8080:8080 -v /root/data:/usr/share/nginx/html nginx |
当然若我们需要持久话,但又不想手动去选择挂载到本机的哪个目录,可以借助 docker volume
,即将本机目录替换为任意名词,docker 会自动帮我们创建 volume
进行保存,更多信息可查看官方文档 DockerVolumesDoc
1 | docker run -p 8080:8080 -v nginx-data:/usr/share/nginx/html nginx |
5. 停止容器
容器停止后需要使用
docker ps -a
才能查询到
1 | docker stop c01701b64b4b |
6. 删除容器
1 | docker rm c01701b64b4b |
四、DockerCompose
当运行容器增多时,一个个容器运行明显麻烦且效率低,此时可借助docker compose进行容器编排
本节内容繁多只顺便一提,需要深入了解和查看官方文档
1. 准备docker-compse.yml文件
表示会启动三个nginx服务,分别映射到端口8080
、8081
、8082
,并挂载卷 nginx-data
,更多编写规则可查询官方文档ComposeFileDoc
1 | services: |
2. 启动
1 | docker-compose up |
3. 停止
1 | docker-compose down |
五、DockerSwarm
Docker compose解决了容器编排问题,而当服务器众多,我们仍然需要到每台服务器上去运行,还需要规划每台服务器内存多大,需要部署哪些应用。该场景下,可通过DockerSwarm将所有服务器的docker连结在一起,我们只需要在管理服务器上进行容器编排,docker会自动平衡服务器资源,将容器自动分配到每台服务器上去运行
本节内容繁多只顺便一提,需要深入了解和查看官方文档
1. 创建swarm集群
在管理服务器(也称管理节点)执行初始化
1 | docker swarm init |
2. 加入集群
在子服务器(也称工作节点)执行管理节点初始化时生成的加入指令
1 | docker swarm join --token SWMTKN-1-53hrzq18zohy9yr1vskutfjyrs2a590xz9d0mjj2m15zu9mtsf-2938j5f50t35ycut0vbj2sx0s 192.168.1.100:2377 |
此时在管理节点执行以下指令即可查看到工作节点已加入
1 | docker node ls |
3. 容器操作
- 使用
docker service create
代替docker run
- 使用
docker service ls
代替docker ps
- 使用
docker stack
代替docker-compose
更多操作请查看官方文档DockerSwarmDoc
六、Portainer
Portainer是一款docker可视化管理后台,日常维护中建议使用Portainer而不用每次都登录服务器ssh去执行命令
1. 安装
执行命令,将docker权限提供给portainer容器,挂载数据卷并暴露到9000端口
数据会被持久化到
/root/volumes/portainer_data
目录,若想保存到其他地方,可自行修改
1 | docker run -d --name ptr --restart=always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /root/volumes/portainer_data:/data portainer/portainer-ce:2.1.1 |
2. 管理
访问 http://127.0.0.1:9000,初次需要创建管理员账号,登录后即可进入管理后台,可对 Stacks
、Services
、Containers
、Images
、Networks
、Volumes
等直接可视化操作。
需要注意的是,若在管理面板中,使用了私有镜像仓库,需要在左侧倒数第二个菜单 Registries
添加私有镜像仓库地址及授权信息。