docker 01

docker

docker的安装

1、安装源

在Linux系统中,可以通过一键命令快速安装Docker。以下是基于Debian和Ubuntu系统的安装命令:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
----------------------------------------------老版本的安装方式----------------------------------
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io


如果你使用的是基于Red Hat的系统(如CentOS、Fedora等),可以使用以下命令:

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
对于新版本的CentOS和Fedora,你可能需要使用dnf代替yum。

确保Docker服务启动并自动启动:

sudo systemctl start docker
sudo systemctl enable docker
安装docker
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils  device-mapper-persistent-data lvm2
# yum的工具包      安装数据存储的数据包
# Step 2: 添加软件源信息 -----  指定阿里云的安装源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
systemctl enable docker 
# 开机启动


阿里云详细介绍
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.12c21b11gItGnB

2、阿里云的镜像加速服务

阿里云 为用户提供不同操作系统的加速地址

1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce

2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://bl7pyv8i.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

容器的执行过程

docker cli 发出命令 到docker server ,daemon 守护进程 启动容器,没有镜像的话,从hub中拉取镜像, 暴露服务

1、镜像

docker  pull  下载镜像
docker  images  ps   查看镜像
docker rmi -f  镜像id 强制删除镜像



2、容器启动

容器的生命周期

docker  create  nginx #  创建容器     # stop的状态
docker  start   nginx #  启动容器     # stop状态
docker  run   nginx #  创建容器 + 启动容器的结合   #  启动的状态

docker  stop nignx  # 停止 容器   
docker  rm  nignx  #  删除 容器   

docker pause nginx  # 暂停状态 
docker unpause nginx  # 恢复start状态 

容器的操作

docker  run   tomcat  # 前台 启动一个容器  

-p  进行宿主机和容器的端口映射的参数
docker  run  -p 80:8080  tomcat  
# 前面的80是宿主机的端口 后面的8080 是容器的端口



docker  run  nginx   # 前台启动容器 ,夯住了 ,ctrl + c 中止

docker  run -d  nginx # -d 后台运行容器


docker rm -f  容器id 强制删除正在运行的容器


docker exec  -it  nginx_test  
# exec 在容器中执行命令 
# it  采用交互方式执行命令
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端    

eg
 docker exec tomcattest ls   
  # 只执行容器内的命令 

 docker exec  -it  tomcattest /bin/bash
  # 提供交互式的命令终端解释器


# 退出 
exit


build编译镜像

docfile镜像的描述文件

dockerfile 文件
FROM tomcat:latest  # 设置基本镜像,尽量使用官方镜像
MAINTAINER DJ   # 说明信息 
LABEL version = 1.0  # 版本号信息
LABEL description = "描述信息"
WORKDIR  /usr/local/tomcat/webapps  # 设置当前的工作目录,没有的话,自动创建,并且切换到当前工作目录,尽量使用绝对目录 

ADD  docker-web ./docweb-web        # 复制dockerfile同目录下的文件或者目录  复制到  容器内的 workdir目录下 
ADD  docker-web.tar.gz  ./docweb-web # 支持解压文件的功能 ,支持远程文件的抓取
COPY  和 ADD的含义基本一致

ENV  PYTHON /usr/local/pyhton2.7  # 环境变量的设定 尽量使用环境变量提高程序的维护性
RUN  ${PYTHON} test.py  



docker build -t baidu.com/mytomcat:1.0  /server/  文件所在目录 相对目录和绝对目录 
                                       #  一定要有目录


容器执行命令
RUN         # 在build 构建时 执行命令
            # 两种命令格式 
               shell  命令格式:  RUN  yum install  -y tree   ### 派生出一个子进程,在子进程中执行命令,命令执行结束,子进程销毁
               exec 命令格式  : RUN  ["yum","install","-y","tree"]  ## 创建exec进程,替换当前进程 ,保持 PID不变
            
ENTRYPOINT  # 容器启动时执行的命令
             # 入口点  只有最后一个ENTRYPOINT 会被执行
             eg
                ENTRYPOINT ["ps"]
            
CMD         # 容器启动后执行默认的命令或者 参数  如果出现多个cmd,也是执行最后一个
             docker run test.com/centos:1.0  -aux  作为 ENTRYPOINT的参数 执行
    
            # 容器启动时 run命令的附加的指令 在dockerfile的 cmd命令 会被忽略
            # ps 命令就是 附件的指令  那么dockerfile里的CMD [" -ef "] 命令就不被执行  

            
FROM centos:latest
MAINTAINER DJ
ENTRYPOINT ["ps"]
CMD ["-ef"]
#  容器启动后 默认参数被替换 如果没有 新的参数 的话,使用cmd的默认参数
docker run test.com/centos:1.0  -aux 

基础镜像的构建

FROM               #来源基本镜像 
MAINTAINER DJ      # 备注信息
RUN                # 构建命令执行
WORKDIR            # 切换工作目录
ADD                # 复制文件 解压文件
EXPOSE 80          # 暴露端口号
CMD                # 容器启动后执行的文件



查看镜像的dockerfile的内容

docker history  redis


镜像的使用

1、容器镜像的导入和导出

持久化docker的镜像或容器的方法
Docker的镜像和容器可以有两种方式来导出

docker save #ID or #Name
docker export #ID or #Name
docker save和docker export的区别
对于Docker Save方法,会保存该镜像的所有历史记录
对于Docker Export 方法,不会保留历史记录,即没有commit历史

docker save保存的是镜像(image),docker export保存的是容器(container);

docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

2 导出命令

save命令 
docker save [options] images [images...]

示例 
docker save -o nginx.tar nginx:latest 
或 
docker save > nginx.tar nginx:latest 
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)



export命令
docker export [options] container
示例
docker export -o nginx-test.tar nginx-test

docker export #ID or #Name > /home/export.tar

其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)

3 导入命令

导入命令

load命令
docker load [options]

示例
docker load -i nginx.tar
或
docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息



import命令
docker import [options] file|URL|- [REPOSITORY[:TAG]]

示例
docker import nginx-test.tar nginx:imp
或
cat nginx-test.tar | docker import - nginx:imp

容器的通信

[root@chihujing ~]# docker run -d --name tomcat  -p 80:8080  tomcat:latest
50a29018b559e5066be4a00eb5422b7d74d41d647565b98f82268b102d37b6da
[root@chihujing ~]# docker run -d  --name centos --link=tomcat -it  centos:latest /bin/bash
ca1497663e393d360fc8cdb65fd7ad903f8215ac28f849d9f77a845abc0dd14d
[root@chihujing ~]# 
[root@chihujing ~]# docker exec -it   centos /bin/bash
[root@ca1497663e39 /]# ping tomcat
PING tomcat (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat (172.17.0.2): icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from tomcat (172.17.0.2): icmp_seq=2 ttl=64 time=0.035 ms
^C
--- tomcat ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.035/0.048/0.062/0.015 ms


#  容器间的单向通信是把 容器的名字 和ip地址 做了本地的域名解析



[root@ca1497663e39 /]# cat /etc/hosts 
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	tomcat 50a29018b559
172.17.0.3	ca1497663e39


双向通信 创建网桥

 network create  -d bridge  my-bridge
 # 创建网桥
docker run -d --name tomcat  -p 80:8080  tomcat:latest
docker run -d  --name centos -it  centos:latest /bin/bash
#  创建容器 

docker network connect my-bridge tomcat
docker network connect my-bridge centos
# 把容器加入到 网桥内

docker network inspect my-bridge 
#  查看 网桥的 ip分配情况


#进入容器 测试即可 ping

创建子网段

docker network create --subnet=172.88.0.0/16 test-network

docker run -e TZ="Asia/Shanghai" \
           --restart always \
           --network dqnetwork \
           --ip 172.88.0.10 \
           --name mysql \
           -e MYSQL_ROOT_PASSWORD=123 \
           -p 3306:3306 \
           -d mysql:5.6.34

容器数据共享 volume

单一文件目录挂载

 单一  容器挂载点  挂载的目录只对 一个容器生效
 docker  run  --name  容器名   -v  宿主机路径:容器内部镜像路径  镜像名
 
 docker run -d --name t1 -p 80:8080 --volume /webapps:/usr/local/tomcat/webapps test.com/my-tomcat:1.0
 docker run -d --name t2 -p 81:8080 --volume /webapps:/usr/local/tomcat/webapps test.com/my-tomcat:1.0
 # 修改挂载文件后,所有的容器 将都发生变化
 


自行build 镜像 ,固定目录

共享挂载点
# 每一个容器都写 挂载命令 ,太过于麻烦 使用共享挂载点的方式  
'''
FROM tomcat:latest
# 设置基本镜像
MAINTAINER DJ
# 说明信息
WORKDIR  /usr/local/tomcat/webapps
ADD  docker-web ./doc-web
'''

docker build -t redorcasz.com\my-tomcat:latest ./

docker run -d --name t1 -p 81:8080  redorcasz.commy-tomcat
docker run -d --name t2 -p 82:8080  redorcasz.commy-tomcat
#  静态文件不能有变化 变化的话,还有重新 打包镜像  --- 不推荐

创建共享容器

'''
FROM tomcat:latest
# 设置基本镜像
MAINTAINER DJ
# 说明信息
RUN  ["rm","-fr","/usr/local/tomcat/webapps"]
RUN  ["mv","/usr/local/tomcat/webapps.dist","/usr/local/tomcat/webapps"]
'''

docker build -t test.com\my-tomcat:2.0 ./
docker create --name web-page -v /server/docker-web:/usr/local/tomcat/webapps/docker-web test.commy-tomcat:2.0 /bin/true
# 创建的web-page ,相当于做了一个软链接 
# 至于为什么要加一个 /bin/true : 这个web-page 是不会启动的,加true只是为了给他一个入口点,保持模式完整性,显着你更加专业,当然你要是想着避免浪费资源的话,使用 tianon/true,开销更小。
docker run -d --name t1 --volumes-from web-page -p 81:8080 test.commy-tomcat:2.0 
docker run -d --name t2 --volumes-from web-page -p 82:8080 test.commy-tomcat:2.0 

# 现在随意修改 本地静态文件,即可达到修改所有的容器的静态文件 

docker-compose

docker-compose安装

https://github.com/docker/compose/releases/tag/v2.6.0 # 下载二进制文件
curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋权
chmod +x /usr/local/bin/docker-compose
# 做软连接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 测试使用
docker-compose --version

容器集群 单机版 编排工具

docker 官方镜像

1、使用官方镜像 作为基础镜像 进行构建 自定义镜像
    比如 MySQL 需要配置环境变量 用户  密码  空密码 还有初始化文件,构建镜像后,自动创建库和表
    jdk 镜像 使用openjdk   构建镜像的时候,加入到jia包文件
    python解释器设置解释器的版本 2和3  等等
    公司自有业务一般需要对基础镜像加工,那么加工的时候要考虑一致性和便利性
 2、    

docker-compose.yml

yml 格式中,value值 和冒号之间必须有空格

yml 格式中,value值 是数字类型 使用单引号,其他类型不需要

------------------------- docker-conpose中自动构建镜像 部署服务---------------------------
version: '3.3'
# 标注 docker-compose的版本号


services:
# 分级的标识符 ,说明services下有资源,下面的key 使用2个空格和services进行显示上下级关系
    
  db:
  # db是服务名的意思,能代表容器资源  网络资源 文件资源 
  #  在理解的直白一点 ,你可以想象成 你容器的名字 
    
    build: ./sql 
      - contest: /server/dockerfile
    # 宿主机的sql目录下的 dockerfile ,自动构建新的镜像
    
    restsrt: unless-stopped  
    
    #  容器 启动方式
                 # 1、no,默认策略,在容器退出时不重启容器
                 # 2、on-failure,在容器非正常退出时(退出状态非0),才会重启容器
                 # 3、on-failure:3 在容器非正常退出时,重启容器,最多重启3次
                 # 4、always,在容器退出时总是重启容器,
                 # 5、unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。
    
    environment:
    # 环境变量的标识符 
      MYSQL_ROOT_PASSWORD: 123456
      
  app:
  # 容器的名称
    build: ./app
    
    depends_on: 
    # 依赖的关系 ,当前容器要能访问某谁 link 的意思
      - db
      # 指定容器名
      
    ports:
    # 容器的端口映射关系 类似于 -p 参数    
      - "80:80"
      #  宿主机端口 和 容器的端口
      
    restart: always
    
    
------------------------- docker-conpose中使用已经打包号的镜像 部署服务---------------------------

version: '3.3'

networks:
# 指定网络资源集合

  test-net:
  # 指定一个网桥的名字
    external: false
    # false 等于 在容器使用的时候再去创建。
    # true 等于 必须先创建网桥的时候在运行docker-compose
    
services:
  nginx-web01:
    images: 
      - nginx:latest
    networks:
      - test-net
    # 引用docker的网桥
    
    
    container_name: web01
    # 相当于 docker  --name=web01
    
    volumes:
    # 挂载文件 可以多个值进行
      - /server/conf:/etc/nignx/conf.d
    
    volumes_from:
      - webpage
    # 引用其他容器的映射关系
  
  
   command:
    - ['ps','-ef']
    # 容器启动后 执行的命令


  dns: 8.8.8.8
  # dns 设置

docker-compose 命令

docker-compose up 
# 启动容器
# -d 后台运行


docker-compose down
# 关闭容器 并且 清楚容器

docker-compose logs
# 查看日志


posted @ 2023-04-11 10:56  mmszxc  阅读(175)  评论(0)    收藏  举报