暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker Hello World之初识篇

Fantasy小平 2021-11-21
395

    初识总是惊艳,在某个黄昏的下午,突然眼前一亮,头脑震撼,糟了,这就是心动的感觉?马萨卡,卡蕾瓦...


    为什么要了解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.tar
    wsl --export docker-desktop-data c:\users\desktop\docker-desktop-data\docker-desktop-data.tar


    删除现有的wsl子系统同时停止Docker desktop:

      #先停止现有的系统
      wsl --shutdown
      #接着做删除操作
      wsl --unregister docker-desktop
      wsl --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 2
        wsl --import docker-desktop-data D:\work\wsl\docker-desktop-data c:\user\desktop\docker-desktop-data\docker-desktop-data.tar --version 2

        然后启动Docker desktop,大功告成。


        修改仓库地址,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项进行查看。


          安装一下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 nginx
              docker 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 image
                FROM ubuntu
                #维护者
                MAINTAINER wjp
                #非必须,主要是使用国内的加速地址  会快一些
                RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' etc/apt/sources.list
                #更新软件库
                RUN apt-get update
                #不带提示的安装nginx
                RUN apt-get install -y nginx
                #将index.html拷贝到指定目录
                COPY index.html var/www/html
                #这三个连起来  构成一个命令  命令以分号结尾,nginx以前台方式运行
                ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
                #暴露端口为80
                EXPOSE 80  
                  # .表示从当前目录去找Dockerfile 进行构建    构建额镜像标签名为hellO_nginx
                  docker 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 ghost
                          COPY ./config.js var/lib/ghost/config.js
                          EXPOSE 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 nginx
                              COPY nginx.conf etc/nginx/nginx.conf
                              EXPOSE 80


                              docker-compose.yml

                                version: '2'
                                # 网络名
                                networks:
                                ghost:
                                #服务列表
                                services:
                                ghost-app:
                                #构建路径 也就是有Dockerfile的目录
                                build: ghost
                                #加入网络
                                networks:
                                - ghost
                                depends_on:
                                - db
                                ports:
                                - "2368:2368"
                                nginx:
                                build: nginx
                                networks:
                                - ghost
                                depends_on:
                                - ghost-app
                                ports:
                                - "80:80"

                                db:
                                #不用Dockerfile构建镜像 直接使用已有镜像
                                image: "mysql:5.7.15"
                                networks:
                                - ghost
                                environment:
                                MYSQL_ROOT_PASSWORD: mysqlroot
                                MYSQL_USER: ghost
                                MYSQL_PASSWORD: ghost
                                volumes:
                                - C:/Users/56913/desktop/ghost/data:/var/lib/mysql
                                ports:
                                - "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。

                                  文章转载自Fantasy小平,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                  评论