Docker学习笔记

2020-11-12  本文已影响0人  D_8270

以下均为个人对docker的理解,相关概念说法不一定正确,但能方便我们去理解。

什么是Docker?

Docker一定程度上可以理解为我们以前玩弄的虚拟机管理软件VM,但其本质是基于linux上的容器概念,可以用docker来创建管理一个一个的容器,这里的容器可以理解为VM中一个个的虚拟机。

为什么要使用Docker?

线上服务器的各种服务(如web服务、数据库等)在部署之前都得进行各种复杂的环境、参数、支持库等的安装和配置,如果同一台服务器上部署多个服务时,每个服务所依赖的环境参数这些在配置过程中还可能产生一定的冲突,进而增加我们的部署难度。
另外,程序开发者在本地进行开发时,也需要对当前项目在不同库、不同系统版本下进行测试,比如python2.x环境和python3.x环境对项目的影响,或者php5和php7等等这样的差异化测试,如果这些配置全部都赤裸裸的配置在本地机器上,势必会产生很多无法预知的问题。

得益于Docker,它可以帮助我们创建一个个的容器,也可以理解为一个个的虚拟环境(VPS),一个个的linux系统,只不过默认的都是些简版系统而已,很多命令都没有,不像市面售卖的VPS已经默认给你装好了很多实用命令。
而且可以在同一台机器上部署多个容器,每个容器之间都是独立的,资源独立、环境配置独立等等,这就是docker为我们做的事情。

如何使用Docker创建容器(创建虚拟机)?

回想之前把玩VM时,我们要创建一个win7、win10、winXP虚拟机时,是不是要先去找对应系统的镜像文件?动辄好几G的文件。
Docker也有镜像文件的概念,而且docker做到了和Github一样,有官方的镜像文件托管站,可以像使用Git一样将你配置的镜像文件push到官方网站,别人也可以pull你所创建的镜像文件,像极了Git的使用,后面我们谈到Nodejs时,也有这个概念。

OK,docker pull下来的镜像文件会由docker统一放在docker的指定的目录中,整个机器都可以共用这些镜像文件。

#查看本机的所有镜像文件
[root@vmi442840 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myproxypool         latest              4ee1b32850f7        25 hours ago        976MB
wordpress           latest              ec5c071010b5        4 weeks ago         546MB
python              3.6                 94b7a322c796        4 weeks ago         874MB
mysql               5.7                 42cdba9f1b08        4 weeks ago         448MB
redis               alpine              bd71e6db4a54        2 months ago        32.2MB

然后可以直接运行一个容器:

docker run -it  wordpress:latest bash  #直接运行一个容器,使用镜像wordpress:latest bash命令行进入

如何创建自己的容器或镜像?

docker的官方网站托管了大量的镜像,如python2、python3、php5、php7、centos、ubantu以及各个用户自己制作上传的镜像,我们可以直接按需pull我们想要的镜像,但有时我们需要制作自己的镜像或是容器,如你编写的一个web服务,也可以做成一个容器,然后也可以导出成一个镜像。
自己制作容器,就会对应到一个Dockerfile文件!

#Dockerfile文件
FROM python:3.6  #表示以官方镜像python:3.6为基础创建,其实这个python:3.6不是python这个语言,而是一个linux系统,然后这个系统里安装了python3.6
WORKDIR /app  #工作目录,登录到该容器时,默认定位到的目录
COPY . .
COPY user_dir/.git-credentials ~/  #从本机拷贝相关文件到容器的目录内
RUN pip install -r requirements.txt  #RUN安装和配置服务所需的各种环境、配置等
RUN apt-get update
RUN apt-get -y install vim
RUN git config --global credential.helper store
VOLUME ["/app/proxypool/crawlers/private"]  #目录挂载,可将本机某目录直接对应到容器某目录,方便宿主机和容器共享文件
CMD ["/app/shell.sh"]
CMD ["supervisord", "-c", "supervisord.conf"] #容器启动时默认执行的命令,此命令必须要,且多条CMD命令时只会执行最后一条,而且最后指定的CMD命令必须是一个不停止的工作任务,否则当这个任务停止后,整个容器也就退出了,无法做到容器一直保活

大部分情况,我们不会这样一个个的启动容器,因为我们同时会有多个服务,每个容器服务都这样创建肯定不合理,因此docker-compose出现了!

什么是docker-compose?

说的直白一点,docker-compose就是一个编排同时管理多个容器的工具,与它配对使用的是一个docker-compose.yml文件,docker-compose命令必须在一个包含docker-compose.yml文件的目录中才能使用,且当下docker-compose命令只能管理当前目docker-compose.yml文件中所涉及的容器,安装在机器上的其他容器无法干扰。
docker-compose的大部分命令基本和docker的命令重合,他们唯一的区别是docker的命令能管理机器上所有的容器和镜像文件,而docker-compose只能管理当前docker-compose.yml文件所涉及的容器。

version: '3'
services:  #services下面一个个的节点就是一个个的容器
  redis:       #节点名称
    image: redis:alpine    #容器所使用的镜像,此处为redis官方镜像
    container_name: redis  #容器名称
    command: redis-server /etc/redis/redis.conf   #该redis服务器启动后所执行的命令,类似于开机启动程序,这与Dockerfile文件中的CMD命令不同
    ports:
      - "6399:6379"  #通信端口映射 宿主机端口:容器端口
    restart: always
    volumes:  #目录挂载
      - ./data/redis:/etc/redis
  proxypool:
    build: .  #表示是自己的容器,在当前目录下找Dockerfile文件进行build
    image: 'myproxypool'
    container_name: myproxypool
    ports:
      - "3535:5555"
    restart: always
    depends_on:
      - redis
    links:
      - redis
    volumes:
      - ./:/app
    environment:  #环境变量,容器启动后往当前容器中写入相关环境变量,类似于mac中的bash_profile
      TEST_URL: https://www.baidu.com/
      REDIS_HOST: redis
      REDIS_PORT: 6389
      REDIS_DB: 0

Docker的入门概念理解大概就是这样,具体的使用以及更高级的操作实际项目中练习。

上一篇下一篇

猜你喜欢

热点阅读