Docker - Docker的基础操作和使用
1. 基础的启动与关闭
- 启动Docker
systemctl start docker
由于启动docker并没有提示,所以需要使用命令查看docker是否正常启动:systemctl status docker
,Active显示状态是running就表示正常启动了。
- 关闭Docker
systemctl stop docker
- 重启Docker
systemctl restart docker
- 开机自启Docker
systemctl enable docker
2. 安装镜像
- 查看已安装的镜像
docker images
- 查看指定镜像
docker search centOS
- NAME:镜像名称
- DESCRIPTION:说明
- START:收藏(点赞)数
- OFFICIAL:是否是官方镜像
- AUTOMATED:是否自动构建(免手动编译)
- 拉取镜像
// 语法 docker pull 要拉取镜像的名[:版本号] // 例如: docker pull centos/mysql-57-centos7
- 删除镜像(无法删除名下还有容器的镜像)
// 语法 docker rmi 镜像ID // 镜像ID在使用docker images命令的时候会展示
3. 容器操作
- 检查正在运行的容器
docker ps -a
- 根据镜像创建容器
// 1.交互式创建容器(非后台运行) // 语法 docker run -i -t --name=自命名(唯一) 镜像[:版本] /bin/bash // 退出,退出即停止容器 exit // 2.守护式创建容器(后台运行) docker run -d -i --name=自命名(唯一) 镜像[:版本] // 进入容器 docker exec -i -t 容器自命名 /bin/bash // 退出容器 exit
- 启动和停止容器
- 启动容器:
docker start <容器名或容器ID>
- 停止容器:
docker stop <容器名或容器ID>
- 启动容器:
- 文件操作
- 从宿主机拷贝文件到容器:
docker cp <宿主机目录/文件> <容器名:容器目录>
- 从容器拷贝文件到宿主机:
docker cp <容器名:容器路径/文件> <宿主机路径[/文件]>
- 目录挂载(仅限于容器创建时):
docker run -d -i --name=<自命名> -v <宿主机路径:容器路径> <镜像名:版本号>
- 从宿主机拷贝文件到容器:
- 查看容器详情
docker inspect <容器名>
- 删除容器(无法删除正在运行的容器)
docker rm <容器名>
- 容器保存为镜像
docker commit <容器名> <镜像自命名>
- 备份镜像
docker save -o 路径/文件名.tar 镜像名
- 根据镜像备份恢复镜像
docker load -i 路径/文件名.tar
4. 常用环境部署
- MySQL
## 语法 docker run -d -i --name=自命名 -p 宿主机端口:容器端口 -e MYSQL_ROOT_PASSWORD=自命密码 镜像 ## 这里的-p就是指端口映射,可以将宿主机和容器的端口连接 ## 宿主机端口看需求是否需要和容器接口相同,取值最大65535,所以不同的话尽量往5位数上起,以免和其他应用冲突 ## -e MYSQL_ROOT_PASSWORD 是初始化MySQL数据库root用户的密码的固定格式 ## 示例 docker run -d -i --name=wk_mysql -p 33066:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7 ## 直接连接宿主机33066端口就可以直接访问容器wk_mysql的服务
- Tomcat
## 语法 docker run -d -i --name=自命名 -p 宿主机端口:容器端口 -v 宿主机路径:容器路径 镜像:版本 ## 这里的端口和mysql里的是一个意思,但是为什么要创建目录挂载? ## 其实创建目录挂载就是为了便于在宿主机放置项目文件,使tomcat容器更方便的运行项目 ## 示例 docker run -d -i --name=wk_tomcat -p 18080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
- Nginx
## 语法 docker run -d -i --name=自命名 -p 80:80 镜像 ## 示例 docker run -d -i --name=wk_nginx -p 80:80 nginx
- Redis
## 语法 docker run -d -i --name=自命名 -p 宿主机端口:容器端口 镜像 ## 示例 docker run -d -i --name=wk_redis -p 6379:6379 redis
5. Dockerfile
Dockerfile实际上是一系列的命令和参数构成的脚本,这些命令应用于基础镜像并创建一个新的镜像。从开发、测试、运维来看,保证了环境的一致性,排除环境的原因导致的问题,减少搭建环境花费的开销。注意:Dockerfile文件的文件名必须是"Dockerfile"。
- 主要语句
- 基于镜像的操作:FROM 镜像名:版本号
- 标注作者:MAINTAINER 作者名
- 设置工作路径:WORKDIR 路径
- 执行命令:RUN 命令
- 添加文件:COPY 宿主机路径/文件 容器路径
- 添加文件并解压:ADD 宿主机路径/文件 容器路径
- 添加环境变量:ENV 环境变量
- 创建镜像
docker build -t='镜像自命名' Dockerfile所在路径
6. 私有仓库
- 搭建私有仓库
Docker官方提供了一个搭载私有仓库的镜像,通过创建此镜像的容器,即可完成私有仓库的搭建。
docker pull registry
默认上传到registry的镜像会保存到容器的/var/lib/registry目录下,所以最好将宿主机的目录也挂载到该目录下。
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --name 容器自命名 registry
验证私有仓库是否搭建成功:http://<IP地址>:5000/v2/_catalog
在Docker的deamon.json文件中添加私有仓库:"insecure-registries" : ["宿主机IP:5000"]
重启Docker:systemctl restart docker
启动私有仓库容器:docker start 容器名
- 上传镜像到私有仓库
给需要上传到私有仓库的镜像打一个标记,标记这是私有仓库的镜像:docker tag 镜像名 仓库IP:5000/镜像名
此时就可以上传镜像到私有仓库:docker push 打标的镜像名
此时再访问:http://IP地址:5000/v2/_catalog ,如果repositories数组显示上传的镜像代表上传成功。 - 删除私有仓库中的镜像(不建议)
v2版本的docker禁止手动删除私有仓库中的镜像,需要配置registry容器的配置文件。使用文本编辑器打开registry容器的配置文件:
docker exec -i -t 容器名 vi /etc/docker/registry/config.yml
修改或者添加storage.delete.enabled属性为true,然后保存并退出(ESC :wq!):
重启registry容器:docker restart 容器名
查看私有仓库中镜像版本(tags):curl -XGET http://IP地址:5000/v2/镜像名/tags/list
查询镜像的sha256值:curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -XGET http://IP地址:5000/v2/镜像名/manifests/版本号
删除私有仓库镜像索引:curl -I -X DELETE http://IP地址:50500/v2/镜像名/manifests/sha256:值
手动触发registry容器垃圾回收:
由于之前将宿主机和register容器做了挂载,所以需要手动删除宿主机的挂载位置下的镜像文件:## 进入registry容器 docker exec -it 容器名 sh ## 执行垃圾回收 registry garbage-collect /etc/docker/registry/config.yml ## 退出容器 exit
rm -rf /挂载路径/docker/registry/v2/repositories/镜像名称
再次访问私有仓库,则指定镜像已被删除:curl -XGET http://IP地址:5000/v2/_catalog