docker及docker-compose安装及使用

docker及docker-compose安装及使用

码农世界 2024-05-23 前端 62 次浏览 0个评论

文章目录

  • 前言
  • 一、什么是docker
  • 二、docker和虚拟机之间的区别
  • 三、docker安装(centos系列安装)
    • 1.安装docker命令
    • 2.启动docer并设置开机自启
    • 3.docker配置加速度
    • 4.docker安装验证
    • 四、docker使用
      • 1.docker常用命令
      • 2.docker参数
        • 1.常用命令
        • 2.基本命令使用
        • 3.网络命令使用
        • 五、使用Dockerfile定制镜像
            • 创建Dockerfile
            • 六、docker-compose安装及使用
              • 1.docker-compose安装
              • 2.dockr-compose命令
              • 3.docker-compose.yml文件配置
              • 4.使用docker-compose
                • 部署flask+mysql+redis服务
                • 总结

                  前言

                  docker安装及使用

                  一、什么是docker

                  Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

                  二、docker和虚拟机之间的区别

                  虚拟机:虚拟机是通过Hypervisor(虚拟机管理系统,常见的有VMWare workstation、VirtualBox),虚拟出网卡、cpu、内存等虚拟硬件,再在其上建立虚拟机,每个虚拟机是个独立的操作系统,拥有自己的系统内核。

                  容器:容器是利用namespace将文件系统、进程、网络、设备等资源进行隔离,利用cgroup对权限、cpu资源进行限制,最终让容器之间互不影响,容器无法影响宿主机。

                  三、docker安装(centos系列安装)

                  1.安装docker命令

                  yum install -y yum-utils
                  
                  yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
                  
                  yum install docker-ce docker-ce-cli containerd.io
                  

                  2.启动docer并设置开机自启

                  systemctl start docker
                  
                  systemctl enable docker
                  

                  3.docker配置加速度

                  修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值;注册阿里云,可获取自己的加速器

                  {. 
                      "registry-mirrors": ["https://registry.docker-cn.com"]
                  }
                  

                  4.docker安装验证

                  docker --version
                  

                  四、docker使用

                  1.docker常用命令

                  指令	说明
                  docker images	查看已下载的镜像
                  docker rmi 镜像名称:标签名	删除已下载的镜像
                  docker search 镜像	从官方仓库(hub.docker.com)查找镜像
                  docker pull 镜像名称:标签名	标签名默认是 latest,代表最新版本。
                  docker run	创建容器
                  docker ps	列出运行中的容器(运行中)
                  docker ps -a	列出所有的容器(运行、未运行)
                  docker rm 容器名称	删除停止的容器
                  docker rm -f 容器名称	删除运行中的容器
                  docker start 容器名称	启动容器
                  docker stop 容器名称	停止容器
                  docker restart 容器名称	重启容器
                  docker exec	执行容器中的指令
                  docker logs -f 容器名称 查看容器日志
                  

                  2.docker参数

                  1.常用命令

                  docker run --name 容器名称 -d -p 主机端口:容器内端口 -e 环境变量 -v localpath:dockerpath --link 其它容器名:容器中别名 镜像名称:标签名
                  -d: 后台运行容器,并返回容器ID;
                  -i: 以交互模式运行容器,通常与 -t 同时使用;
                  -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
                  --name="XXXX": 为容器指定一个名称;
                  -e username="XXXX": 设置环境变量;
                  -m :设置容器使用内存最大值;
                  --link=[]: 添加链接到另一个容器;当要访问其它容器中的内容时,需要先链接才可以使用
                  -p: 开放一个端口或一组端口
                  -v: 映射容器的卷
                  

                  2.基本命令使用

                  启动容器

                  docker run -d --name jenkins -v /root/xvdd:/var/jenkins_home -p 8888:8080 -p 50001:50000 jenkins/jenkins:lates
                  

                  查看日志

                  docker logs -f jenkins
                  

                  命令交互

                  docker exec -it --user root jenkins bash
                  

                  复制文件至容器中

                  docker cp test.py jenkins:/root
                  

                  3.网络命令使用

                  查看默认网络

                  docker network ls
                  

                  查看网络详细信息

                  docker  network inspect 网络id
                  

                  创建新网络

                  docker network create -d 网络类型 新网络名称
                  

                  使用新网络

                  docker run -d -it --network test_network --name network_test1 jenkins/jenkins
                  

                  删除网络

                  docker network rm test_network
                  

                  五、使用Dockerfile定制镜像

                  Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

                  创建Dockerfile

                  FROM ubuntu:16.04
                  # 复制国内更新源
                  COPY sources.list /etc/apt/sources.list
                  # 跳转到指定目录
                  WORKDIR /home
                  # 复制文件到容器
                  COPY requirements.txt .
                  # 安装curl、python3、pip3以及flask用的包
                  RUN apt-get update \
                      && apt-get install python3 -y && apt-get install curl -y \
                      && apt-get install python3-pip -y \
                      && pip3 install --upgrade pip \
                      && apt-get --purge remove python3-pip -y \
                      && curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py \
                      && python3.5 get-pip.py \
                      && pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
                  # 复制flask示例py文件
                  COPY main.py .
                  # 对外暴露端口
                  EXPOSE 8899
                  # 运行测试项目
                  CMD ["python3","main.py"]
                  

                  用到的文件

                  构建镜像

                  docker build -t ubuntu_flask:2.0 . -f Dockerfile_3
                  

                  启动服务:

                  命令小结:

                  # Base images 基础镜像
                  FROM centos
                  #MAINTAINER 维护者信息
                  MAINTAINER xxxxxx
                  #ENV 设置环境变量
                  ENV PATH /usr/local/nginx/sbin:$PATH
                  #ADD  文件放在当前目录下,拷过去会自动解压
                  ADD nginx-1.8.0.tar.gz /usr/local/  
                  ADD epel-release-latest-7.noarch.rpm /usr/local/  
                  #RUN 执行以下命令 
                  RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
                  RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
                  RUN useradd -s /sbin/nologin -M www
                  #WORKDIR 相当于cd
                  WORKDIR /usr/local/nginx-1.8.0 
                  RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
                  RUN echo "daemon off;" >> /etc/nginx.conf
                  #EXPOSE 映射端口
                  EXPOSE 80
                  #CMD 运行以下命令
                  CMD ["nginx"]
                  

                  六、docker-compose安装及使用

                  Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务

                  1.docker-compose安装

                  github上下载二进制文件

                  https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64
                  

                  放入/usr/local/bin/ 路径下并重新命名添加可执行权限

                  mv docker-compose-linux-x86_64 docker-compose
                  chmod +x docker-compose
                  

                  2.dockr-compose命令

                  docker-compose up
                  用于部署一个 Compose 应用
                  默认情况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件
                  当然用户也可以使用 -f 指定其他文件名。通常情况下,会使用 -d 参数令应用在后台启动
                  docker-compose stop
                  停止 Compose 应用相关的所有容器,但不会删除它们
                  被停止的应用可以很容易地通过 docker-compose restart 命令重新启动
                  docker-compose rm
                  用于删除已停止的 Compose 应用
                  它会删除容器和网络,但是不会删除卷和镜像
                  docker-compose restart
                  重启已停止的 Compose 应用
                  如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效
                  docker-compose ps
                  用于列出 Compose 应用中的各个容器
                  输出内容包括当前状态、容器运行的命令以及网络端口
                  docker-compose down
                  停止并删除运行中的 Compose 应用
                  它会删除容器和网络,但是不会删除卷和镜像
                  

                  3.docker-compose.yml文件配置

                  1. image
                  services:
                    web:
                      image: hello-world
                  在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。 image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。 例如下面这些格式都是可以的:
                  image: redis
                  image: ubuntu:14.04
                  image: tutum/influxdb
                  image: example-registry.com:4000/postgresql
                  image: a4bc65fd
                  2. build
                  服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。
                  build: /path/to/build/dir
                  也可以是相对路径,只要上下文确定就可以读取到 Dockerfile。
                  build: ./dir
                  设定上下文根目录,然后以该目录为准指定 Dockerfile。
                  build:
                    context: ../
                    dockerfile: path/of/Dockerfile
                  注意 build 都是一个目录,如果你要指定 Dockerfile 文件需要在 build 标签的子级标签中使用 dockerfile 标签指定,如上面的例子。 如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字。
                  build: ./dir
                  image: webapp:tag
                  既然可以在 docker-compose.yml 中定义构建任务,那么一定少不了 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:
                  build:
                    context: .
                    args:
                      buildno: 1
                      password: secret
                  下面这种写法也是支持的,一般来说下面的写法更适合阅读。
                  build:
                    context: .
                    args:
                      - buildno=1
                      - password=secret
                  与 ENV 不同的是,ARG 是允许空值的。例如:
                  args:
                    - buildno
                    - password
                  这样构建过程可以向它们赋值。
                  注意:YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。
                  3. command
                  使用 command 可以覆盖容器启动后默认执行的命令。
                  command: bundle exec thin -p 3000
                  也可以写成类似 Dockerfile 中的格式:
                  command: [bundle, exec, thin, -p, 3000]
                  4.container_name
                  前面说过 Compose 的容器名称格式是:<项目名称><服务名称><序号> 虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定:
                  container_name: app
                  这样容器的名字就指定为 app 了。
                  5.depends_on
                  在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。 例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。 例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:
                  version: '2'
                  services:
                    web:
                      build: .
                      depends_on:
                        - db
                        - redis
                    redis:
                      image: redis
                    db:
                      image: postgres
                  注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。
                  6.dns
                  和--dns参数一样用途,格式如下:
                  dns: 8.8.8.8
                  也可以是一个列表:
                  dns:
                    - 8.8.8.8
                    - 9.9.9.9
                  此外 dns_search 的配置也类似:
                  dns_search: example.com
                  dns_search:
                    - dc1.example.com
                    - dc2.example.com
                  7. tmpfs
                  挂载临时目录到容器内部,与 run 的参数一样效果:
                  tmpfs: /run
                  tmpfs:
                    - /run
                    - /tmp
                  8. expose
                  这个标签与Dockerfile中的EXPOSE指令一样,用于指定暴露的端口,但是只是作为一种参考,实际上docker-compose.yml的端口映射还得ports这样的标签。
                  expose:
                   - "3000"
                   - "8000"
                  9. external_links
                  在使用Docker过程中,我们会有许多单独使用docker run启动的容器,为了使Compose能够连接这些不在docker-compose.yml中定义的容器,我们需要一个特殊的标签,就是external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。 格式如下:
                  external_links:
                   - redis_1
                   - project_db_1:mysql
                   - project_db_1:postgresql
                  10. extra_hosts
                  添加主机名的标签,就是往/etc/hosts文件中添加一些记录,与Docker client的--add-host类似:
                  extra_hosts:
                   - "somehost:162.242.195.82"
                   - "otherhost:50.31.209.229"
                  启动之后查看容器内部hosts:
                  162.242.195.82  somehost
                  50.31.209.229   otherhost
                  复制Error复制成功...
                  11. logging
                  这个标签用于配置日志服务。格式如下:
                  logging:
                    driver: syslog
                    options:
                      syslog-address: "tcp://192.168.0.42:123"
                  默认的driver是json-file。只有json-file和journald可以通过docker-compose logs显示日志,其他方式有其他日志查看方式,但目前Compose不支持。对于可选值可以使用options指定。 有关更多这方面的信息可以阅读官方文档: https://docs.docker.com/engine/admin/logging/overview/
                  12. ports
                  映射端口的标签。 使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。
                  ports:
                   - "3000"
                   - "8000:8000"
                   - "49100:22"
                   - "127.0.0.1:8001:8001"
                  13. volumes
                  挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOSTCONTAINERro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。 Compose的数据卷指定路径可以是相对路径,使用.或者..来指定相对目录。 数据卷的格式可以是下面多种形式:
                  volumes:
                    // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
                    - /var/lib/mysql
                    // 使用绝对路径挂载数据卷
                    - /opt/data:/var/lib/mysql
                    // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
                    - ./cache:/tmp/cache
                    // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
                    - ~/configs:/etc/configs/:ro
                    // 已经存在的命名的数据卷。
                    - datavolume:/var/lib/mysql
                  如果你不使用宿主机的路径,你可以指定一个volume_driver。
                  volume_driver: mydriver
                  14. volumes_from
                  从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的。
                  volumes_from:
                    - service_name
                    - service_name:ro
                    - container:container_name
                    - container:container_name:rw
                  15. network_mode
                  网络模式,与Docker client的--net参数类似,只是相对多了一个service:[service name] 的格式。 例如:
                  network_mode: "bridge"
                  network_mode: "host"
                  network_mode: "none"
                  network_mode: "service:[service name]"
                  network_mode: "container:[container name/id]"
                  可以指定使用服务或者容器的网络
                  16. networks
                  加入指定网络,格式如下:
                  services:
                    some-service:
                      networks:
                       - some-network
                       - other-network
                  关于这个标签还有一个特别的子标签aliases,这是一个用来设置服务别名的标签,例如:
                  services:
                    some-service:
                      networks:
                        some-network:
                          aliases:
                           - alias1
                           - alias3
                        other-network:
                          aliases:
                           - alias2
                  相同的服务可以在不同的网络有不同的别名
                  

                  4.使用docker-compose

                  服务 (service):一个应用容器

                  项目 (project):由一组关联的应用容器组成的一个完整业务单元

                  可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理

                  部署flask+mysql+redis服务

                  创建三个文件夹及docker-compose.yml文件:

                  flask构建镜像文件:

                  配置docker-compose.yml文件

                  version: '3'
                  services:
                      redis:
                          image: redis
                          expose:
                              - 6379
                          ports:
                              - "6399:6379"
                      mysql:
                          image: mysql:5.7
                          expose:
                              - 3306
                          ports:
                              - "3307:3306"
                          environment:
                              MYSQL_ROOT_PASSWORD: python
                              MYSQL_USER: root
                          volumes:
                              - ./02_mysql:/var/lib/mysql
                      flask:
                          build: ./01_flask
                          volumes:
                              - ./01_flask/project:/home/project
                          ports:
                              - "8883:5000"
                          depends_on:
                              - mysql
                              - redis
                  

                  该路径下执行命令

                  docker-compose up
                  

                  停止并删除容器

                  总结

                  docke日常部署服务非常便捷,启动速度都是秒级,对与虚拟机而言轻量快捷,而且一个docker镜像可以启动多个容器,构建一个自己需要的定制化镜像,所有平台都可以畅快使用。

转载请注明来自码农世界,本文标题:《docker及docker-compose安装及使用》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,62人围观)参与讨论

还没有评论,来说两句吧...

Top