初识总是惊艳,在某个黄昏的下午,突然眼前一亮,头脑震撼,糟了,这就是心动的感觉?马萨卡,卡蕾瓦...
为什么要了解Docker呢?我想了一想,主要是有3点理由,第一个是在开发中,可能会需要本地的redis/mq/mysql,如果老老实实的去安装,你懂得,天知道会遇到什么奇怪的问题,本来只想随便找个环境用一下,没想到打开了一个新世界,脑袋里充满了问号和惊叹号。这不是我想要的,那么Docker或许可以快速的帮你打开世界的大门。第二个理由是,别人或许已经部署了一个服务,一些nginx或者redis是用Docker去部署的,然后你接手了,但是你不会?怎么办,煎饼果子来一套,果断自己手动安装一遍软件,换成自己了解的常规操作,不过这样挺花时间。有的时候只是改个配置,然后重启一下,或者看看日志之类的。因此了解一下Docker是有有必要的。第三个理由,那就是闲着也是闲着,你难道就没有夜晚寂寞难耐,蠢蠢欲动的时候?这个时候就应该打开电脑,学习Docker啦。正所谓,我为zhuangbility而生,我也为它而死。
说了这么多,接下来就是见证奇迹的时刻了,搞起。
来到官网,找到windows版本的下载包,大概500多兆,很快就下载好了。注意,win10的系统比较好安装,win7系统需要安装toolbox,有点麻烦,略。
下载下来安装包,就是一顿点点点,随后安装完毕,是使用的过程中,一般是第一次启动Socker desktop,会提示你更新windows的WSL2的包,就跟着它来到windows的网页,跟着操作就对了。然后下载一个wsl_update_x64.msi的安装包,安装它,然后用命令启动它,就好了。后面的那些复杂的操作,我不懂,也没有跟着它操作,似乎也没啥用的样子?
总之呢,安装真的是太方便了,不到半小时就能弄好,这是一个巨大的进步。下面就来调整一些设置。
1首先是修改默认的镜像文件存储位置,我翻遍了可视化界面的所有选项,发现没法修改,也不知道它究竟放在了哪里。那怎么行呢?c盘资源这么紧张,必须改成其它盘。
因为我使用的是WSL2的版本,所以docker desktop在安装的时候创建两个wsl子系统,使用命令wsl -l -v --all
:
会出现下面2个: docker-desktop docker-desktop-data
docker-desktop是存放程序的,docker-desktop-data是存放镜像的,这两个wsl子系统都是默认放在系统盘的。
导出wsl子系统镜像(导出到桌面):
wsl --export docker-desktop c:\users\desktop\docker-desktop\docker-desktop.tarwsl --export docker-desktop-data c:\users\desktop\docker-desktop-data\docker-desktop-data.tar
删除现有的wsl子系统同时停止Docker desktop:
#先停止现有的系统wsl --shutdown#接着做删除操作wsl --unregister docker-desktopwsl --unregister docker-desktop-data
导入数据到新盘(导入到d盘中,注意分两个目录,都导出到同一个目录似乎不行):
# 注意命令后面的--version 2 不要少了wsl --import docker-desktop D:\work\wsl\docker-desktop c:\user\desktop\docker-desktop\docker-desktop.tar --version 2wsl --import docker-desktop-data D:\work\wsl\docker-desktop-data c:\user\desktop\docker-desktop-data\docker-desktop-data.tar --version 2
然后启动Docker desktop,大功告成。
2 修改仓库地址,Docker 默认是从dockerhub上拉取镜像的,因此可能速度很很慢很慢,慢到难以忍受,所以需要修改为国内的镜像加速地址。假设你有阿里云的账号,那么阿里云会提供给你一条镜像加速地址,专属于你,地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
恰好我有阿里云,但我不告诉镜像加速地址,因为它就是我的唯一,baby 你就是我的唯一...预备,唱。
使用docker help命令,就会出现如下的信息:

然后进入该目录,在子目录或者当前目录找到daemon.json,打开它,添加或者修改如下的键值对:
"registry-mirrors": ["https://字符串过于刺激不便于展示.com/cc"]
然后重启Docker desktop,大功告成。可以使用docker info来查看是否修改成功,找到Registry Mirrors项进行查看。
3 安装一下redis,这里就是随便安装一下,怎么配置我也不懂。
#拉取redis的latest标签的镜像到本地docker pull redis#查看所有本地镜像,当然就看到刚才我们拉取的镜像docker images#以后台方式启动一个redis容器,它是从redis镜像来的 ,端口映射是从本地的6379映射到Docker redis容器的6379端口。docker run -p:6379:6379 -d redis#查看正在运行的容器 这里我们就看到了刚才运行的容器。docker ps#使用Redis desktop 链接一下redis,连接成功。
4安装一下nginx,我也是随便弄弄,不懂其他的。
docker pull nginxdocker run -p 8080:80 -d nginx#页面访问http://127.0.0.1:8080 出现nginx欢迎页面 ok#将外部文件index.html拷贝进入容器 的指定目录下 再次访问,页面变成我们自己的了docker cp index.html 容器ID://usr/share/nginx/html#进入容器 进入之后你可以修改nginx配置文件docker exec -it 容器ID bin/bash#退出容器exis#对容器所做额修改,仅对容器有效。如果想要镜像也有修改,可以将该容器保存为镜像docker commit -m 'modify' 容器ID nginx-own : 将这个容器保存为镜像 镜像名字为 nginx-own#下次就用nginx-own来启动一个新容器 这样修改都是我要的,妈妈再也不用安心我的学习啦#停止原来额容器docker stop 容器ID#删除刚停止的容器docker rm 容器ID#删除原来的nginx镜像docker rmi 镜像ID#查看所有容器docker ps -a
5 Dockerfile
镜像都是从无到有的构建起来的,使用Dockerfile可以构建镜像,比如构建一个我们自己的nginx镜像。Dockerfile如下:
#从这里构建 base images 一般都有base imageFROM ubuntu#维护者MAINTAINER wjp#非必须,主要是使用国内的加速地址 会快一些RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' etc/apt/sources.list#更新软件库RUN apt-get update#不带提示的安装nginxRUN apt-get install -y nginx#将index.html拷贝到指定目录COPY index.html var/www/html#这三个连起来 构成一个命令 命令以分号结尾,nginx以前台方式运行ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]#暴露端口为80EXPOSE 80
# .表示从当前目录去找Dockerfile 进行构建 构建额镜像标签名为hellO_nginxdocker build -t hello_nginx .
使用hello_nginx镜像就跟其它是一样的,启动容器后,访问页面,看看是不是自己的页面。
6 Volume
这个是一个卷,我的理解就是将一个指定的文件系统映射到容器内部的某些目录。这个系统文件可能是本机的一个目录,也可以我们自己使用docker创建的Volume。
#将当前目录下的html目录 映射到容器的指定目录下 对于nginx来说,前端额js随时都可能更换,用这个挺方便docker run -p 8080:80 -d -v $PWD/html:/usr/share/nginx/html nginx# 检查容器内部 可以提供很多丰富额信息docker inspect nginx
7 Registry
还记得最开始的步骤吗,就是修改镜像仓库地址。
#从镜像仓库搜索某镜像,返回列表docker search nginx#从镜像仓库拉取某镜像docker pull nginx#将本地镜像推倒镜像仓库docker push xxx
8 docker-compose
这是一个插件,用来将几个容器串联起来。比如一个应用,一般是先访问nginx,nginx反向代理到某一个应用,而这个应用访问了mysql。如果是分开使用Dockerfile构建各自的镜像,再启动容器。那么容器与容器间的交互就很困难,因此使用docker-compose可以很方便的解决这个问题。
docker-compose是windows版本的Docker desktop自带的,使用docker-compose --version 查看版本。
加入这三个应用分别为nginx ghost-app 以及mysql。ghost-app 访问mysql,nginx访问ghost-app,我们访问nginx。
一起做起来吧。
首先创建三个子目录: data nginx ghost
data目录是作为mysql的外挂卷,也就是信息存储到这里,不会随着容器的消失而消失。nginx目录下面放Dockerfile 以及nginx.conf ,用它们来构建nginx镜像。ghost目录下面放Dockerfile以及config.js,用它们来构建gost-app的镜像。mysql镜像已经在镜像仓库中存在了,因此不用构建。 此外跟这三个目录并且的,还有一个文件docker-compose.yml,这个文件是个总入口,告诉docker-compse如何去编排容器,以及构建它们之间的关系。
各个目录的内容和解释:
ghost目录
config.js:
var path = require('path'),config;config = {production: {url: {},main: {},database:{client: 'mysql',connection: {host: 'db',user: 'ghost',password: 'ghost',database: 'ghost',port: '3306',charset: 'utf8'},debug: false},paths: {contentPath: path.join(process.env.GHOST_CONTENT,'/')},server: {host: '0.0.0.0',port: '2368'}}};module.exports = config;
主要配置mysql连接信息,注意mysql的host是db 这个是docker-compose去处理和解析的。
Dockerfile:
FROM ghostCOPY ./config.js var/lib/ghost/config.jsEXPOSE 2368# 最新的ghost不要这个#CMD ["npm","start","--production"]
nginx目录
nginx.conf:
worker_processes 1;events {worker_connections 1024;}http {server {listen 80;charset utf-8;location {proxy_pass http://ghost-app:2368;}}}
注意里面的proxy_pass ghost-app这个名称依旧是需要docker-compose去解析和处理的。
Dockerfile:
FROM nginxCOPY nginx.conf etc/nginx/nginx.confEXPOSE 80
docker-compose.yml
version: '2'# 网络名networks:ghost:#服务列表services:ghost-app:#构建路径 也就是有Dockerfile的目录build: ghost#加入网络networks:- ghostdepends_on:- dbports:- "2368:2368"nginx:build: nginxnetworks:- ghostdepends_on:- ghost-appports:- "80:80"db:#不用Dockerfile构建镜像 直接使用已有镜像image: "mysql:5.7.15"networks:- ghostenvironment:MYSQL_ROOT_PASSWORD: mysqlrootMYSQL_USER: ghostMYSQL_PASSWORD: ghostvolumes:- C:/Users/56913/desktop/ghost/data:/var/lib/mysqlports:- "3306:3306"
构建镜像并运行
#构建镜像 完毕后,会有三个镜像docker-compose build#拉起服务 然后就可以通过http://127.0.0.1:80访问我们的应用了docker-compose up -d#期间可能镜像构建成功,但是拉起服务失败,比如某些容器可以运行,某些容器立即退出#使用该命令去查看nginx容器为何闪退docker-compose logs nginx#找到了错误原因,修改之 重新构建镜像和拉起服务#停止服务 不用我们一个一个容器去停docker-compose stop#删除相关额容器 不用我们手动一个个删docker-compose rm
找到原因,并最终打开浏览器,看到了页面,顿时老泪纵横,再使用navcat连接了一个mysql,没有问题,顿时心头一暖。算是没有白忙活,初次了解了一下Docker。




