文章仅写个人理解,错误之处望请指出,谢谢 ~ (≧▽≦)/ ~
docker的简单使用介绍
什么是docker
我简单地理解为docker是一个升级版虚拟机,他性能更快,这里不探究docker和虚拟机的区别,也许后续会补充说明~~
使用场景
我们使用docker的时候是想在原有的环境运行其他环境的程序,比如我服务器环境是ubuntu18+mysql8+php8,有一天我需要环境为ubuntu16+mysql5+php5的环境来运行特殊的程序,但我只有一个服务器,这时候就会使用docker来搭建新的环境,打包成镜像,进而通过运行镜像来执行特殊程序脚本
上面只是一种常规的使用方式,从上面的例子我们也可以把这个docker镜像当成手机的一个App。我们制作好App后交予他人使用,别人是不用管App的功能具体是如何实现的,只要App能正常运转即可,因此我们可以扩展其他功能,如php环境我们可以开启加密扩展并在镜像内制定特定的解密密钥,这样我们可以将镜像和加密后的php代码交予合作方。合作方可以正常使用我们提供的功能,但不知道我们代码具体实现
有点啰嗦,,,其他功能不一一列举,自己探索。。。
概念介绍
主要概念有镜像和容器。
镜像可以简单理解为软件安装包,容器则是安装后点击运行的App状态。这里加个状态主要是一个镜像可以开启多个容器,而有同一个镜像开启的容器是可以不一致的。镜像和容器互相独立。
比如docker两次运行ubuntu镜像后会产生两个容器,它们同时存在相互独立,也可以交流。我们可以进入容器1安装nginx,进入容器2安装php,这时候两个容器实现的功能是不一致的,一个是实现nginx进行http监听,另一个是可以执行php脚本,我们可以将nginx接收到的http请求透传给另一个容器来处理php脚本。
安装
可以再ubuntu上运行
sudo apt-get remove docker docker-engine docker.io containerd runc
但这样安装打包镜像会出现问题,我自己在ubuntu18遇见过,因此推荐官网上安装方式
镜像使用
镜像下载
docker pull image
- image 镜像ID或镜像名称,包括版本号,如果没明确填写,默认为latest
显示已安装的镜像
docker images
- REPOSITORY 镜像名称
- TAG 镜像标签,版本号
- IMAGE ID 镜像唯一ID
- CREATED 创建时间
- SIZE 镜像大小
运行镜像
docker run -it web:7.0 /bin/bash
- -run 运行某个镜像的一个实例,后面需要镜像名称或者镜像ID,如果镜像不存在,将从Docker hub下载。镜像名称后无指定标签,如 web 默认使用latest 即 run web 如同 run web:latest
- -it 表示在交互模式下运行
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
也可以实现其他功能,例如
sudo docker run --name zto-php-nginx -p 8080:80 \
-v /var/www:/usr/share/nginx/html:ro \
-v /zto/conf/default.conf:/etc/nginx/conf.d/default.conf:ro \
--link php-fpm-zto:php \
-d nginx bash home/start.sh
- -v 挂载文件,将本地文件拷贝覆盖到容器中,使用后容器中可以使用本地文件
- -p 端口透传,将本地8080端口与docker容器中的80端口建立透传
- –link 把 php-fpm-zto 的网络并入 zto-php-nginx。
- -d 后台运行不退出
- home/start.sh 启动容器时容器内自动运行的脚本。home/start.sh是用户自定义的shell脚本,使用场景如,我自己创建一个web镜像,运行镜像后,产生的容器内没有自动启动nginx和php进程,我可以将 systemctl restart nginx.service 加入到start.sh脚本,如此使用镜像会自动自行start.sh,自动开启nginx进程
删除镜像
docker rmi image
容器
容器列表
容器是Docker镜像的运行实例,每运行一次镜像会创建一个容器
docker ps
- CONTAINER ID 容器ID
- IMAGE 镜像名称
- PORTS 建立透传的端口
容器的常规操作
容器的启动/停止/重启
docker start/stop/restart CONTAINER
容器的删除
docker rm CONTAINER
容器shell
进入退出容器
docker exec -it CONTAINER /bin/bash
已交互方式运行镜像时会自动进入容器里,这时候下图红色箭头指向的就是当前容器的容器ID
退出直接在容器shell内执行 exit
- CONTAINER 容器ID
构建镜像
构建镜像估计使我们开发使用docker的核心功能。Docker通过读取Dockerfile中的指令,自动构建镜像。Dockerfile是一个用于创建Docker镜像的配置文件,文本格式,里面包含了创建镜像的指令。
命令
docker build -t image:tag dir
- -t 给镜像加一个Tag
- image 构建好的镜像名称
- tag 版本号,如果没有明确指定,默认为latest
- dir Dockerfile文件所在路径
Dockerfile
下面为构建一个只有ubuntu18.04的镜像,并将本地Dockerfile文件当前目录下的data目录拷贝入构建的镜像中。
运行后会自动找基础镜像并下载
此处为新构建的镜像
Dockerfile指令
- FROM 指定基础镜像。FROM nginx 和 FROM ubuntu的区别在于前者有nginx,而后者没有,即便FROM ubuntu,使用镜像启动容器后,容器里是没有服务器自带的常规工具的。无法通过 vim 修改创建文件等。
- MAINTAINER 镜像构建维护员,谁创建谁修改就谁的。
- ENV 指令设置容器中的环境变量。DEBIAN_FRONTEND=noninteractive 表示设置所有操作都是非交互式的
- COPY 构建镜像时将本地目录或文件拷贝到镜像里一起打包。需要拷贝的数据越大,构建速度越慢,构建完的镜像大小也越大
- RUN 为当前镜像执行命令。apk add --no-cache bash 是允许构建好的镜像使用bash 命令进入
- CMD 设置容器运行时的默认命令。例如:nginx容器运行时,需要默认启动nginx服务器,可以CMD指令设置。
镜像修改
sudo docker commit -m "修改" -a "zto" 容器ID zto/web:1.0
- -m 备注,提交的说明信息
- -a 指定更新的用户信息
- zto/web:1.0 用户名/镜像名,如果要上传到docker hub需要按这个格式命名
构建后的镜像可能没有最终想要的效果,我们可以使用镜像启动容器,进入容器内修改至我们需要的效果,然后进一步打包成镜像。
如上述新构建的zto-web镜像只有ubuntu的基础框架,我们需要nginx的功能,可以如下操作 :
- 使用镜像启动容器,记录容器ID
2.安装nginx
3.退出保存修改,将容器打包成镜像
4.上传到hub。上传时要用 用户名/镜像名 会自动上传到官网的hub上。 这里我不上传,只做释放,结果是失败的
sudo docker push user/image:tag
!!!我们可以搭建私人的hub,但我目前没这种需求,觉得没必要,就不写了!!!
参考
文章仅写个人理解,主要是为了复习和备忘录,并不系统撰写教程(主要是笔者这方面能力还需提高,后续再考虑撰写完整详细的教程)
官方docker hub链接:https://hub.docker.com/
系统的教程和参考链接如下:
https://www.qikegu.com/docs/2970
https://www.runoob.com/docker/docker-dockerfile.html