docker 基础

目录

第一章 docker 安装
第二章 docker 镜像加速
第三章 docker 镜像管理
第四章 docker 镜像命令
第五章 docker 容器命令
第六章 docker 容器网络访问(端口映射)
第七章 docker 数据卷管理
第八章 docker 容器互联

1、Docker解决了什么问题.

  • 快速交付和部署(镜像与容器)
  • 资源的高效利用和隔离(高密度部署)
  • 轻松的迁移和扩展(一次封装,到处运行)
1586322129437.png

2、容器化对比虚拟机

对比属性 Container VM
隔离性 基于进程隔离 提供资源的完全隔离
启动时间 秒级 分钟级
内核 共用宿主机内核 使用独立内核
占用资源 MB级 GB级
系统支持容量 单机支持上千个容器 一般几十个

3.docker 虚拟化理论

Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace  资源隔离
cgroups    进程的资源限制
kvm       虚拟磁盘文件,资源隔离
kvm       资源限制,--cpus --memory

4.docker的主要组成部分

docker是传统的CS架构分为docker client和docker server,向mysql一样    

命令:docker version
[root@controller ~]# docker version 
Client: Docker Engine - Community
 Version:           23.0.2
 API version:       1.42
 Go version:        go1.19.7
 Git commit:        569dd73
 Built:             Mon Mar 27 16:18:54 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          23.0.2
  API version:      1.42 (minimum version 1.12)
  Go version:       go1.19.7
  Git commit:       219f21b
  Built:            Mon Mar 27 16:16:31 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.20
  GitCommit:        2806fc1057397dbaeefbea0e4e17bddfbd388f38
 runc:
  Version:          1.1.5
  GitCommit:        v1.1.5-0-gf19387a
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0



docker主要组件有:镜像、容器、仓库, 网络,存储

启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库
image.png

第一章 docker 安装

# 清楚旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 安装依赖
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

# 下载yum源
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 安装docker server client 最新稳定版本
yum install docker-ce docker-ce-cli containerd.io

# 指定安装哪个版本
yum list docker-ce --showduplicates | sort -r
yum install docker-ce- docker-ce-cli- containerd.io

# 启动docker&加入开机自启
systemctl start docker 
systemctl enable docker

# 查看版本
docker version

# 查看详细信息
docker info

第二章 docker 镜像加速

docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行

部署服务,环境问题、一次构建,处处运行 、docker是一种软件的打包技术

加速命令

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://sg60ky37.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

第三章 docker 镜像管理

选镜像的建议:  
1,优先考虑官方  

2,stars数量多

官方镜像仓库地址:http://hub.docker.com

获取镜像    docker pull(push)    
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,
Docker 中国官方镜像加速:[https://registry.docker-cn.com](https://registry.docker-cn.com)    
官方pull  docker pull centos:8(没有指定版本,默认会下载最新版)  
私有仓库pull  docker pull daocloud.io/huangzhichong/alpine-cn:latest

第四章 docker 镜像命令

搜索镜像    
    docker search
查看镜像列表
    docker images  or  docker image  ls
删除镜像
    docker rmi  例子:docker image rm centos:latest
导出镜像
    docker save  例子:docker image save centos -o docker-centos7.tar.gz
导入镜像
    docker load  例子:docker image load -i docker-centos7.tar.gz
查看详情 
    docker inspect 例子:  docker inspect image_name[:tag]

第五章 docker 容器命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 常用选项
-d  守护态运行,放在后台
-p  Publish a container's port(s) to the host ( container和host端口映射)
-i  以交互模式运行容器,通常与 -t 同时使用
-t  为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="nginx-lb"  为容器指定一个名称
-v, --volume value  源地址(宿主机):目标地址(容器)

docker run -it --name centos6 centos:6.9 /bin/bash
-it   分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh覆盖容器的初始命令

运行容器***
    docker run image_name   

    docker run ==== docker create  + docker start
启动容器
    docker start  ID或NAME
停止容器
    docker stop   ID或NAME
杀死容器
    docker kill container_name
查看容器列表
    docker ps(-a -l  -q)
查看容器的详细信息
    docker inspect 容器ID
进入正在运行的容器(目的,调试,排错)
*** docker exec  (会分配一个新的终端tty)
        docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

    docker exec -it  容器id或容器名字 /bin/bash(/bin/sh)   

删除容器
    docker rm
批量删除容器
    docker rm -f `docker ps -a -q`

查看运行日志
docker logs container_id/container_name

总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!

业务在容器中运行:初始命令,夯住,启动服务

第六章 docker容器的网络访问(端口映射)

docker0:172.17.0.1   jumpserver:172.17.0.2   nginx:172.17.0.3

指定映射(docker 会自动添加一条iptables规则来实现端口映射)
    docker run -p hostPort:containerPort
    docker run -p ip:hostPort:containerPort  多个容器都想使用8080端口
    docker run -p ip::containerPort(随机端口)
    docker run -p hostPort:containerPort/udp
    docker run -p  10.0.0.100::53/udp   使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
    docker run -p 81:80 –p 443:443 可以指定多个-p

随机映射
    docker run -P (随机端口)

通过iptables来实现的端口映射

第七章 docker 数据卷管理

1.将主机操作系统目录直接映射进容器,类似于Linux中的mount。数据卷很好的解耦了容器应用和数据。对数据卷内数据的操作(无论是在本地主机还是容器内),都会立即生效。

docker run -d -p 3307:3306 -v /my/custom:/etc/mysql/conf.d \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql1 mysql:5.7

-v hostDir:containerDir:hostDir不存在会自动创建,默认权限是rw,也可以改为ro,这样容器内部就无法对数据卷的数据进行修改了。

# 数据卷创建
docker volume create [OPTIONS] [VOLUME]
docker volume create hello
docker run -d -p 3307:3306 -v hello:/etc/mysql/conf.d \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql01 mysql:5.7

# 数据卷列表
docker volume ls

# 数据卷详情
docker volume inspect hello

[
    {
        "CreatedAt": "2020-04-08T06:43:08Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/hello/_data",
        "Name": "hello",
        "Options": {},
        "Scope": "local"
    }
]

数据卷(文件或目录)
    -v 卷名:/data (第一次卷是空,会容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
    -v src(宿主机的目录):dst(容器的目录)
数据卷容器
    --volumes-from(跟某一个已经存在的容器挂载相同的卷)

2.docker cp 用于容器与主机之间的数据拷贝

# 容器拷贝到本地
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- 

# 本地拷贝到容器
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

- `SRC_PATH` 指定为一个文件

  - `DEST_PATH` 不存在:文件名为 `DEST_PATH`,内容为SRC的内容
  - `DEST_PATH` 不存在并且以 `/` 结尾:报错
  - `DEST_PATH` 存在并且是文件:目标文件内容被替换为SRC_PATH的文件内容。
  - `DEST_PATH` 存在并且是目录:文件复制到目录内,文件名为SRC_PATH指定的名字

- `SRC_PATH` 指定为一个目录

  - `DEST_PATH` 不存在:`DEST_PATH`创建文件夹,复制源文件夹内的所有内容

  - `DEST_PATH` 存在是文件:报错

  - `DEST_PATH` 存在是目录

    - `SRC_PATH` 不以 `/.` 结束:源文件夹复制到目标里面
    - `SRC_PATH` 以 `/.` 结束:源文件夹里面的内容复制到目标里面

    自动创建文件夹不会做递归。把父文件夹做好

3.数据卷容器
如果需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但他专门用来提供数据卷供其他容器挂载。

docker run -it -v /idata --name idata ubuntu

docker run -it --volumes-from idata --name d01 ubuntu
docker run -it --volumes-from idata --name d02 ubuntu
#使用--volumes-from参数所挂载的数据卷容器本身不需要保持在运行状态

4.数据卷的用法细节

docker run -d -P --name nginx nginx
#方便修改nginx的配置和html页面等
#容器中 /usr/share/nginx/html
#容器中 /etc/nginx

# 参照一下各种写法
# hostPath:containerPath

docker run -d -P --name nginx -v /opt/nginx/html:/usr/share/nginx/html nginx
# 为什么看到的是403而不是index页面内容。原来容器里面变为空了?
# 主机的内容复制到容器中,导致,容器同步到了主机的空文件夹。
# 特别是配置问题,必须提前保证我们主机挂载的目录里面提前有内容。

docker run -d -P --name nginx -v /opt/nginx:/etc/nginx nginx
#为什么docker ps看不到;出错了。open() "/etc/nginx/nginx.conf" failed (2: No such file or directory) nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
# 我就想自定义挂载路径,并且把他们挂载出来?
    # 1、复制容器的文件
        docker cp
        1、启动一个nginx,先不挂载。
        2、docker cp把运行中的nginx的内容复制出来
            Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
                    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
        docker cp nginx:/usr/share/nginx/html /opt/hahanginx
        nginx:/usr/share/nginx/html/. 把html里面的内容复制到 /opt/hahanginx
        nginx:/usr/share/nginx/html 把html文件夹复制到 /opt/hahanginx
        
        
        完整过程
        mkdir /opt/nginx
        docker cp nginx:/usr/share/nginx/html /opt/nginx 复制html
        docker cp nginx:/etc/nginx/. /opt/nginx/conf
        docker run -d -P --name nginx -v /opt/nginx/conf:/etc/nginx -v /opt/nginx/html:/usr/share/nginx/html nginx
        
# 匿名卷方式volume,挂载任意目录
docker run -d -P --name nginx02 -v 容器路径
eg:
docker run -d -P --name nginx02 -v /usr/share/nginx/html -v /etc/nginx nginx
想要知道到底迎合到主机的哪里了?
docker inspect nginx02.
"Mounts": [
            {
                "Type": "volume",
                "Name": "9f4f8ac4c9cd9cb77df7a5386a5b68520c98ea1bb28e26b6593255c1d0ff9cdf",
                "Source": "/var/lib/docker/volumes/9f4f8ac4c9cd9cb77df7a5386a5b68520c98ea1bb28e26b6593255c1d0ff9cdf/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "68afef2bf4979e2c9369f6eb68f8a94adc61e63d3a1fb3dad7469e243442cf32",
                "Source": "/var/lib/docker/volumes/68afef2bf4979e2c9369f6eb68f8a94adc61e63d3a1fb3dad7469e243442cf32/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

#匿名挂载的缺点?不好维护。 docker volume可以维护他们
docker volume ls

#具名挂载。有卷。如果有可视化界面。我们就知道卷是干嘛,就不乱删除了。
#创建好的卷,会自动的和容器中需要挂载的这个文件夹做好同步。
docker volume create 卷名字, 创建一个卷。/var/lib/docker/volumes/自定义的卷名/_data
docker run -d -P --name nginx03 -v nginxconf:/etc/nginx -v nginxhtml:/usr/share/nginx/html nginx
最佳实战。

怎么判断挂载的是卷名而不是本机目录名
  不以/开始就是卷名,以/开始就是主机名。 
 
#改变文件的读写权限
#ro:readonly rw:readwrite; 指定容器对我们这个挂载出来的内容的读写权限
docker run -d -P --name nginx04 -v nginx04conf:/etc/nginx:ro -v nginx04html:/usr/share/nginx/html:rw nginx
ro:效果
root@c721b01b2752:/etc/nginx# echo 123 > nginx.conf
bash: nginx.conf: Read-only file system
容器内不能再对ro指定的所有进行修改了。

第八章 docker 容器互联

1、端口映射

docker create -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name hello-mysql mysql:5.7

-p HostPort:ContainerPort | IP:HostPort:ContainerPort | HostPort:ContainerPort

  • 查看端口映射
    • docker port hello-mysql

2、容器互联

--link name:alias,name连接容器的名称,alias连接的别名

场景:我们无需暴露mysql的情况下,让web应用使用mysql;

docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d --link mysql01:mysql --name tomcat tomcat:7

docker exec -it tomcat bash
cat /etc/hosts

你可能感兴趣的:(docker 基础)