Docker学习笔记

298 阅读8分钟

Ubuntu安装Docker

使用脚本自动安装

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

Docke镜像加速器

  • 修改/etc/docker/darmon.json
{
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ]
}
  • 然后重新启动服务
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker镜像

  1. 获取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库号[:标签]

具体的选项可以通过docker pull --help命令看到。

  • Docker镜像仓库地址:地址的格式一般是<域名/IP>[:端口号]。默认地址是Docker Hub。
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即<用户名>/<软件名>,对于Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。
    比如:
root@Ubuntu:~# docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
3386e6af03b0: Pull complete 
49ac0bbe6c8e: Pull complete 
d1983a67e104: Pull complete 
1a0f3a523f04: Pull complete 
Digest: sha256:181800dada370557133a502977d0e3f7abda0c25b9bbb035f199f5eb6082a114
Status: Downloaded newer image for ubuntu:16.04
docker.io/library/ubuntu:16.04
  1. 镜像运行容器
docker run -it --rm ubuntu:16.04 bash
  • -it:-i(交互式操作),-t(终端)
  • -rm:退出容器时同时把容器删除
  • ubuntu:16.04:指定启动容器的镜像
  • bash:用于交互的Shell
  1. 镜像体积
  2. 虚悬镜像
<!--删除虚悬镜像方法-->
docker image prune
  1. 删除本地镜像
docker image rm imagesId
docker rmi ubuntu:18.04
  1. 使用dockerFile定制镜像
  • 在一个空白目录中,建立一个文本文件,命名为Dockerfile:
mkdir mynginx
cd mynginx
touch Dockerfile

<!--Dockerfile的内容如下-->
<!--FROM tomcat:8.0

WORKDIR  /usr/local/tomcat/webapps/ROOT/
RUN rm -fr *
RUN echo "Hello, Docker!" > /usr/local/tomcat/webapps/ROOT/index.html

* FROM(指定基础镜像)-必填
* WORKDIR(切换目录到指定路径)等同于cd的功能
* RUN<命令>(执行命令)

* COPY 复制文件
* ADD更高级的复制文件
* CMD容器启动命令
* ENTRYPOINT入口点
* ENV设置环境变量
* VOLUME定义匿名卷
* EXPOSE暴露端口
* WORKDIR指定工作目录
-->

  • 构建镜像
docker build -t myproject .
  • 构建镜像上下文

Dockerfile指令

  1. COPY(原路径可以是通配符,满足Go的filepath.Match规则即可)
  • COPY<原路径>...<目标路径>
  • COPY["<原路径1>",..."<目标路径>"]
FROM tomcat:8.0
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *
COPY fczj-frontend-web.zip .
RUN unzip fczj-frontend-web.zip
RUN rm -rf fczj-frontend-web.zip
WORKDIR /usr/local/tomcat
  1. ADD(在COPY的基础上增加了一些功能)
  • 如果<源路径>是一个tar压缩文件,格式为gzip,bzip2以及xz时ADD指令会自动解压文件到指定目录。
FROM tomcat:8.0
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *
ADD myproject.tar.gz .
WORKDIR /usr/local/tomcat
  1. EXPOSE<端口1>[<端口2>...]
  • EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口。
  1. CMD指令
  • 用于指定默认的容器主进程的启动命令
CMD["catalina.sh", "run"]
  1. ENV
  • 用于设置环境变量

操作Docker容器

  1. 查看正在运行的docker容器
docker ps -a

2.重启docker容器

docker restart <容器ID或容器名称>
  1. 指定容器名称
docker run -p 8080:8080 --name tomcat tomcat
  1. 暂停docker容器
docker stop <容器ID或名称>
  1. 守护态运行(后台运行)
docker run -p 8080:8080 --name tomcat -d tomcat
  1. 进入容器
docker exec -it <容器ID或名称> bash
  1. 清理所有未运行的容器
docker container prune

Docker数据卷(Docker容器的数据持久化)

  1. 创建一个数据卷
docker run -p 8080:8080 --name tomcat -d -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat:8.0

docker部署数据库mySql

  • 拉去mySql的镜像
docker pull mysql:5.7.22
  • 启动mySql容器并绑定数据卷
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.22
  • 将容器的文件复制到宿主机
docker cp mysql:/etc/mysql .

Docker三剑客之Compose(快速部署分布式应用)

  1. Compose中有两个重要概念
  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
  1. Compose的下载和安装
  • 直接下载对应的二进制包
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
  • 配置一个docker-compose.yml文件
version: '3'
services:
  tomcat:
    restart: always
    image: tomcat:8.5.50
    container_name: tomcat
    ports:
      - 8080:8080

  • 使用docker-compose
    启动docker容器
<!--在有docker-compose.yml目录下执行-->
docker-compose up
<!--指定docker-compose.yml目录的执行-->
docker-compose -f <路径> up
<!--docker-compose守护态运行-->
docker-compose up -d

关闭docker容器

docker-compose down

查看docker运行日志

docker-compose logs -f tomcat

使用docker-compose部署项目

  • 添加配置文件docker-compose.yml
version: '3'
services:
  web:
    restart: always
    image: tomcat:9-jre8
    container_name: web
    ports:
      - 8080:8080
    volumes:
      - /usr/local/docker/myproject/ROOT:/usr/local/tomcat/webapps/ROOT

  mysql:
    restart: always
    image: mysql:5.7.22
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

Git的安装

  1. Git-2.14.3-64-bit.exe
    git软件包
  2. TortoisseGit-2.5.0.0-64bit.msi
    git可视化工具
  3. TortoiseGit-LanguagePack-2.5.0.0-64bit-zh_CN.msi
    git可视化工具中文包

第三方代码托管平台

  1. GitHub
  2. Gitee (码云)
  3. 码市

git的使用

  1. git clone <地址>

  2. git配置文件(.gitignore)
    将不需要提交的文件描述添加到.gitignore

  1. git add

  2. git commit -m <描述>
    代码提交到本地仓库

git commit -m "修改"
  1. git push
    代码同步到服务器

GitLab

开源的代码托管平台

基于docker构建gitLab

  1. 拉取中文版的gitLab容器镜像
docker pull twang2218/gitlab-ce-zh:11.0.3
  1. 创建docker-compose.yml文件
  • 注意: external_url的端口要跟nginx的一致
version: '3'
services:
    web:
      image: 'twang2218/gitlab-ce-zh:11.0.5'
      restart: always
      hostname: '192.168.94.132'
      environment:
        TZ: 'Asiz/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://192.168.94.132:8080'
          gitlab_rails['gitlab_shell_ssh_port'] = 2222
          unicorn['port'] = 8888
          nginx['listen_port'] = 8080
      ports:
        - '8080:8080'
        - '8443:443'
        - '2222:22'
      volumes:
        - /usr/local/docker/gitlab/config:/etc/gitlab
        - /usr/local/docker/gitlab/data:/var/opt/gitlab
        - /usr/local/docker/gitlab/logs:/var/log/gitlab

3.登陆设置密码 账号: root 密码: 12345678

使用SSH的方式拉取和推送项目

  1. 生成SSH KEY(使用ssh-leygen工具生成)
ssh-keygen -t rsa -C "your_email@example.com"
  1. 复制SSH生成的公钥配置到仓库中

Nexus(依赖管理平台-maven私服)

  1. 拉取Nexus镜像文件
docker pull sonatype/nexus3
  1. 修改数据卷的权限
chmod 777 data/
  1. 创建docker-compose.yml文件
version: '3.1'
services:
  nexus:
    restart: always
    image: sonatype/nexus3:3.13.0
    container_name: nexus
    ports:
      - 8081:8081
    volumes:
      - /usr/local/docker/nexus/data:/nexus-data
  1. 默认用户名和密码
账号: admin
密码: admin123
  1. 在项目中使用Maven-私服
  • 配置认证信息(maven的settings.xml)
    <servers>
        <server>
            <id>nexus-releases</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
        <server>
            <id>nexus-snapshots</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
    </servers>
  • 配置自动化部署
<distributionManagement>
    <repository>
        <id>nexus-releases</id>
        <name>Nexus Release Repository</name>
        <url>http://47.112.215.6:8081/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>nexus-snapshots</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://47.112.215.6:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>
  • 将项目按模块打包上传到私服(项目依赖包部署到私服)
mvn deploy
  • 将第三方JAR包上传到Nexus私服的方法
# 如第三方JAR包:aliyun-sdk-oss-2.2.3.jar
mvn deploy:deploy-file
  -DgroupId=com.aliyun.oss
  -DartifactId=aliyun-sdk-oss
  -Dversion=2.2.3
  -Dpackaging=jar
  -Dfile=D:\aliyun-sdk-oss-2.2.3.jar
  -Durl=http://127.0.0.1:8081/repository/maven-3rd/
  -DrepositoryId=nexus-releases

搭建docker镜像私服(registry)

  1. 拉去registry镜像文件
docker pull registry:3.1
  1. 创建docker-compose.yml文件
version:  '3.1'
services:
  registry:
    image: registry
    restart: always
    container_name: registry
    ports:
      - 5000:5000
    volumes:
      - /usr/local/docker/registry/data:/var/lib/registry
  1. 访问Registry仓库
http://192.168.94.132:5000/v2
  1. 配置Docker-Registry客户端(/etc/docker/daemon.json)
{
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ],
    "insecure-registries": [
        "ip:5000"
    ]
}

  1. 重新启动服务
systemctl daemon-reload
systemctl restart docker
  1. 测试镜像上传
## 拉去一个镜像
docker pull nginx

## 查看全部镜像
docker images

## 标记本地镜像并指向目标仓库(ip:port/image_name:tag,改格式为标记版本号)
docker tag nginx 192.168.75.133:5000/nginx

## 查看全部镜像
curl -XGET http://192.168.75.133:5000/v2/_catalog

## 查看指定镜像
curl -XGET http://192.168.75.133:5000/v2/nginx/tags/list

## 测试删除镜像
docker rmi nginx
docker rmi 192.168.75.133:5000/nginx

使用docker-registry-frontend操作界面

  1. 配置docker-compose.yml配置文件
version: '3.1'
services:
  frontend:
    image: konradkleine/docker-registry-frontend:v2
    ports: 
      - 8080:80
    volumes:
      - ./certs/frontend.crt:/etc/apache2/server.crt:ro
      - ./certs/frontend.key:/etc/apache2/server.key:ro
    environment:
      - ENV_DOCKER_REGISTRY_HOST=192.168.94.132
      - ENV_DOCKER_REGISTRY_PORT=5000

实现docker(nexus、registry、gitlab的一次构建到处运行)

  1. 将myShop项目上传到gitlab
## 1. add
## 2. commit
## 3. push
  1. 下载maven并配置maven环境变量
## 1. 解压maven对应的压缩包到/usr/local文件夹
## 2. 在/etc/profile中添加配置
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH:$HOME/bin

  1. 安装jdk(注意安装linux系统版本)
## 1. 配置用户环境变量
  1. 下载依赖包并打包项目
mvn clean package -Dmaven.test.skip=true
  1. 创建Dockerfile构建docker镜像
  • 将项目根目录压缩并移动到image文件夹
tar -zcvf myshop.tar.gz .
mv myshop.tar.gz image/
  • 创建并编辑Dockerfile文件
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *
ADD myshop.tar.gz /usr/local/tomcat/webapps/ROOT
RUN rm myshop.tar.gz
WORKDIR /usr/local/tomcat/webapps/ROOT
  • 执行构建语句
docker build -t 47.112.215.6:5000/myshop .
  • 上传到docker私服仓库
docker push 47.112.215.6:5000/myshop
  • 创建myshop-deploy文件夹并编辑docker-compose.yml文件
version: '3.1'
services:
  myshop:
    restart: always
    image: 47.112.215.6:5000/myshop
    container_name: myshop
    ports: 
      - 8080:8080