Docker

本文详细介绍了Docker的基本概念、安装步骤、入门教程,包括镜像、容器和仓库的定义,以及Dockerfile的使用。此外,还列举了常用的Docker命令,并探讨了Docker Compose在容器编排中的应用,以及如何使用Docker部署GitLab、Nexus、Harbor和WordPress等服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


把docker当作桌面系统来用

Docker简介

解决的痛点

  1. 传统的开发,如果需要一个服务部署在多台电脑,需要有多台服务器,以及每次都要重复部署
  2. 每次重装系统都得配置相应的开发环境

解决方案

  1. 虚拟机
  2. 容器

虚拟机VS容器:

特性容器虚拟机
启动秒级分钟级
存储MBGB
性能接近原生弱于原生
支持数量单机支持上千个容器几十个

容器的用途:

  1. 组建微服务架构:一台机器上可以跑多个容器,每个容器部署服务,模拟微服务的架构
  2. 整体打包:可以在一台机器上配置不同的平台、环境(软件依赖、系统)进行打包形成容器
  3. 弹性伸缩:可以在云主机上快速部署容器服务提供更多并发和资源
  4. 环境一致性:打通开发、测试、生产环境,高度保存一致性,降低意外发生

Docker安装

  1. sudo apt-get install docker
  2. sudo apt-get install docker.io
  3. sudo apt-get install docker-registry :用来搭建私用仓库(可选)

  • 可用 docker version 查看是否安装成功
  • 把docker权限给当前用户,否则每次需要权限,sudo groupadd docker sudo gpasswd -a ${USER} docker newgrp docker
  • 运行hello-world:官网注册账号,然后登录docker login,就可以从docker hub(官网维护的公共仓库)拉取镜像,docker image pull hello-world docker run hello-world
  • 镜像加速:新建或编辑文件 vim /ect/docker/daemon.json 添加以下内容:
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

然后sudo systemctl daemon-reload 再重启服务sudo systemctl restart docker,可用docker info 看到有Registry Mirrors:字段改变就行

Docker入门教程

知识

  1. 三个概念:
     镜像(image):给容器运行提供资源,里面包含依赖、程序;image可看做是一个类,Docker利用image生成对象,同一个image可生成多个对象同时运行,
     容器:image是静态的,但是运行起来就是容器,是个类创建的实例。
     仓库:存放image的地方,我们可以将image上传到仓库,也可从仓库下载。有官方的仓库,本地也有仓库。

  2. 注意事项
    容器运行有自己的存储层,但是生命周期和容器一样,一旦容器消亡,存储层 的数据也消失,所以应该使用数据卷(volume)、或者挂载物理机的目录,这些位置的读写会直接跳过存储层,直接对物理层读写。

  3. Client/Server架构
    在这里插入图片描述

  • Client:client通过RESTFUL API发送docker命令到docker daemon进程(Docker后台进程,用于管理镜像,容器以及数据卷),docker daemon进程执行镜像编译,容器启停以及分发,数据卷管理等,一个client可以与多个docker daemon通信、交互
  • DOCKER_HOST: 可以在本地,当然也可以在远端服务器上,在host里面有两个重要的东西一个是Image,一个是Containers,
  • Registry:用于存储Docker镜像,类似github,公共的Registry有Docker Hub和Docker Cloud。
  1. Dockerfile文件
    用来构建镜像的文件,类似于Makefile,Docker根据Dockfile配置生成image,
  • 案例介绍
FROM node:8.4    #该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的,会从官网下载
COPY . /app       #将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
WORKDIR /app     #指定接下来的工作路径为/app
RUN ["npm", "install", "--registry=https://registry.npm.taobao.org"]   #在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000/tcp   #将容器 3000 端口暴露出来, 允许外部连接这个端口。

然后执行:docker image build -t koa-demo:0.0.1 . -t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径。docker image ls 可以看到新生成的image。
然后执行:docker run -p 8000:3000 -it koa-demo:0.01 /bin/bash ,-p参数:容器的 3000 端口映射到本机的 8000 端口。-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。/bin/bash:容器启动以后,内部第一个执行的命令。


可以在Dockfile最后加入 CMD node demos/01.js,表示一启动docker就执行的命令,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

常用命令

docker

  • 启动docker服务 : sudo systemctl start docker
  • 终止docker服务:sudo systemctl stop docker

镜像

  • 搜索相关image:docker search ubuntu
  • 拉取image:docker image pull hello-world
  • 删除image:docker rmi -f hello-world
  • 推送image:docker push image_name:tag_name 官网得先登录:docker login
  • 列出本地image:docker image ls
  • 为镜像设置标签:docker tag 容器id image_name:tag_name
  • 跟新镜像:docker commit -m "add eigen library" container_id image_id:tag_id
  • Dockerfile构建镜像:docker build -t ubuntu:16.04 path_to_Dockerfile,-t:指定镜像名。

容器:

  • 启动、停止容器:docker start id docker stop id , 或者直接Ctr+d 或者docker kill id 都能退出容器运行
  • 查看所有正在运行的容器:docker ps 或者 docker container ls, -a列出所有包括 终止运行的容器文件,依然会占据硬盘空间,
  • 删除容器:可以使用docker container rm id
  • 删除所有已停止的容器:docker container prune
  • 利用image启动一个容器:docker run --rm -it ubuntu:16.04 /bin/bash,–rm:停止运行后,自动删除容器文件, -i:交互式操作,-t:终端,ubuntu:ubuntu镜像,/bin/bash:传递的命令参数, --volume “$PWD/”:/var/www/html 把当前目录映射到容器的/var/www/html
  • 多个终端打开docker:找到container id,然后执行docker exec -it container_id /bin/bash, 这样就打开了另一个终端,但是如果第一个终端退出,这个也会退出。 另外的方法

Docker Compose

docker compose是docker的官方开源项目,负责容器集群的快速编排。

注意:如果使用的是本地image,docker-compose镜像后面需要加版本,否则会从网上拉取。

  1. 下载并修改权限:
sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

  1. 编辑docker-compose.yaml

tomcat:

version: '3'
services:
  tomcat: #服务名称,随意
    restart: always # 重启docker时,自动启动相关容器
    image: tomcat #使用tomcat镜像, 如果本地没有从网上拉
    container_name: tomcat # 容器名,自定义
    ports: #映射端口,宿主:docker
      - 8080:8080
    volumes: # 将宿主机的目录 映射到  docker下目录,这样数据就可以持久保存
      - ~/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
    environment: #环境变量
      TZ: Asia/Shanghai

mysql:

version: '3'
services:
  db:
    image: mysql
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: itdragons
      MYSQL_USER: itdragons
      MYSQL_PASSWORD: 123 
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_0900_ai_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3306:3306
    volumes:
      - ~/docker/mysql/db:/var/lib/mysql
      - ~/docker/mysql/conf/my.cnf:/etc/my.cnf
      - ~/docker/mysql/init:/docker-entrypoint-initdb.d/
      - ~/docker/mysql/sql_backup:/backup

  adminer:
    image: adminer
    container_name: adminer
    restart: always
    ports:
      - 9006:8080    
  1. 通过docker-compose up -ddocker-compose down 开启和关闭服务,-d 后台运行。

GitLab

gitlab是一个开源的版本管理系统,实现一个自托管的Git项目仓库。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。下面通过docker来搭建代码托管平台:gitlab

version: '3'
services:
    gitlab:
      image: 'twang2218/gitlab-ce-zh'
      restart: unless-stopped
      hostname: '10.28.204.162'
      environment:
        TZ: 'Asia/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://10.28.204.162:9999'
          gitlab_rails['time_zone'] = 'Asia/Shanghai'
          gitlab_rails['gitlab_shell_ssh_port'] = 2222
          unicorn['port'] = 8888
          nginx['listen_port'] = 9999  #要和ports第一个右边的相同
          # 需要配置到 gitlab.rb 中的配置可以在这里配置,每个配置一行,注意缩进。
          # 比如下面的电子邮件的配置:
          # gitlab_rails['smtp_enable'] = true
          # gitlab_rails['smtp_address'] = "smtp.qq.com"
          # gitlab_rails['smtp_port'] = 465
          # gitlab_rails['smtp_user_name'] = "9579249@qq.com"
          # gitlab_rails['smtp_password'] = "成功开启POP3/SMTP服务后对应的授权码,写入此处"
          # gitlab_rails['smtp_authentication'] = "login"
          # gitlab_rails['smtp_enable_starttls_auto'] = true
          # gitlab_rails['smtp_tls'] = true
          # gitlab_rails['gitlab_email_from'] = '9579249@qq.com'
      ports:
        - '9999:9999'
        - '443:443'
        - '2222:22'
      volumes:
        - ~/docker/gitlab/config:/etc/gitlab
        - ~/docker/gitlab/data:/var/opt/gitlab
        - ~/docker/gitlab/logs:/var/log/gitlab


Nexus


Harbor


禅道

version: '3.1'
services:
  zendao:
    image: easysoft/zentao:12.5.3  #或者不标明版本取最新,
    restart: always
    container_name: zendao
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - 9001:80
    volumes:
      - ~/docker/zentao/app:/www/zentaopms
      - ~/docker/zentao/data:/var/lib/mysql

Docker部署WordPress

阮一峰的微服务教程

version: '3.1'
  2 
  3 services:
  4 
  5   wordpress:
  6     image: wordpress
  7     ports:
  8       - 8080:80
  9     environment:
 10       WORDPRESS_DB_HOST: db
 11       WORDPRESS_DB_USER: julian
 12       WORDPRESS_DB_PASSWORD: 123456
 13       WORDPRESS_DB_NAME: wordpress_db
 14     volumes:
 15       - ~/docker/wordpress/app:/var/www/html
 16 
 17   db:
 18     image: mysql:5.7
 19     environment:
 20       MYSQL_DATABASE: wordpress_db
 21       MYSQL_USER: julian
 22       MYSQL_PASSWORD: 123456
 23       MYSQL_ROOT_PASSWORD: 123456
 24     ports:
 25       - 3306:3306
 26     volumes:
 27       - ~/docker/wordpress/db:/var/lib/mysql


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值