Docker基础知识

Dokcer基础知识


Docker和虚拟技术的区别

  • 虚拟技术需要虚拟硬件,运行一个完整的操作系统,然后在操作系统上运行应用
  • 虚拟技术启动速度较慢,体积较大
  • 容器内的应用直接运行在宿主机上,容器没有自己的内核(kernel),也没有虚拟硬件
  • 每个容器相互隔离,每个容器内都有一个属于自己的文件系统,互不影响
  • 容器启动速度快,体积小

Docker基本名词

  • 镜像(image)
    镜像就是一个模板,可以通过这个模板创建容器服务

  • 容器(container)
    Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建

  • 仓库(repository)
    仓库是存放镜像的地方,仓库分为公有仓库(Dokcer Hub)和私有镜像,需配置镜像加速,提高拉取镜像速度

Docker安装

# 1、卸载旧版docker
yum remove docker \
            docker-client \
            docker-client-latest \
            docker-common \
            docker-latest \
            docker-latest-logrotate \
            docker-logrotate \
            docker-engine

#2、安装基础安装包
yum install -y yum-utils

#3、设置镜像仓库
yum-config-manager \ 
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

#更新yum软件包索引
yum makecache fast

#4、安装docker相关包,docker-ce社区版本,docker-ee企业版本
yum install docker-ce docker-ce-cli containerd.io

# 5、启动Dokcer
systemctl start docker

# 6、查看是否安装成功、
docker version

# 7、运行hello-world镜像
docker run hello-world

# 8、卸载Docker
yum remove docker-ce docker-ce-cli container.io

# 9、删除资源
rm -rf /var/lib/docker # /var/lib/docker是docker默认工作路径
  

阿里云镜像加速

登录阿里云后,在容器服务中找到镜像地址

# mkdir -p /etc/docekr

# tee /etc/docker/daemon.json <<-'EOF' 
{
    "registry-mirrors":["https://s7t9j923.mirror.aliyuncs.com"]]
}

Docker常用命令

帮助命令

docker version # 显示docker基本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令

镜像命令

docker images 查看主机上的镜像信息

[root@angrykun ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
mysql         latest    ecac195d15af   3 weeks ago   516MB
hello-world   latest    feb5d9fea6a5   7 weeks ago   13.3kB

# 解释
REPOSITORY :仓库
TAG: 版本
IMAGE ID:镜像Id
SIZE:大小

# 参数
  -a # 列出所有镜像
  -f # 过滤镜像
  -q #列出所有镜像Id

[root@angrykun ~]# docker images -f "dangling=true"  //过滤标记为空的镜像

docker search 搜索命令

[root@angrykun ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11680     [OK]
mariadb                           MariaDB Server is a high performing open sou…   4450      [OK]

#  可选项

--filter=STARS=3000 # 加上过滤条件

docker pull 拉取镜像

[root@angrykun ~]# docker pull mysql
Using default tag: latest   # 默认tag是latest
latest: Pulling from library/mysql
b380bbd43752: Pull complete # 分层下载,docker image的核心是联合文件系统
f23cbf2ecc5d: Pull complete
30cfc6c29c0a: Pull complete
b38609286cbe: Pull complete
8211d9e66cd6: Pull complete
2313f9eeca4a: Pull complete
7eb487d00da0: Pull complete
4d7421c8152e: Pull complete
77f3d8811a28: Pull complete
cce755338cba: Pull complete
69b753046b9f: Pull complete
b2e64b0ab53c: Pull complete
Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 # 防伪签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

# 等价语句(以下两个语句作用相同)
docker pull mysql 
docker pull docker.io/library/mysql:latest

# 指定不同的版本镜像
docker pull mysql:tag # tag 为docker hub上支持的镜像版本,如docker pull mysql:5.7

docker rmi 删除镜像

[root@angrykun ~]# docker rmi 镜像Id # 删除单个镜像
[root@angrykun ~]# docker rmi 镜像Id1 镜像Id2 # 删除多个镜像
[root@angrykun ~]# docker rmi $(docker images -aq)像Id2 # 删除所有镜像

容器命令

docker run 启动容器

docker run [可选参数] image

# 参数说明
--name="Name" # 容器名称,如mysql1、mysql2用来区分容器
-d # 后台方式运行
-it #使用交互的方式运行,进入容器查看内容
-p # 指定容器端口 -p 80810:8080
   # -p ip:主机端口:容器端口
   # -p 主机端口:容器端口(常用)
   # -p 容器端口
   # 容器端口
-P # 随机指定端口

# 启动并进入容器
[root@angrykun ~]# docker run -it centos /bin/bash
[root@723b2a37f47d /]#

exit 退出容器

[root@723b2a37f47d /]# exit
exit # 退出后容器停止运行

ctrl+p+q # 退出容器,容器不停止运行

docker ps 查看运行容器

docker ps [可选参数]
 # 列出正在裕兴的容器
-a # 列出所有容器
-n # 指定最近n个运行的容器
-q # 列出容器Id

docker rm 删除容器

docker rm 容器Id # 删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) # 删除所有容器,-f 强制删除
docker ps -a -q|xargs docker rm # 删除所有容器

docker start 容器Id 启动容器

docker stop 容器Id 停止容器

docker restart 容器Id 重启容器

其他常用命令

docker run -d 后台启动容器

docker run -d 镜像名
docker run -d centos

# 问题 docker ps发现centos停止了

# 常见问题:docker容器使用后台运行,就必须有一个前台进程,docer发现没有应用会自动停止
# nginx容器启动后,发现没有提供服务会立刻停止,导致没有程序

docker logs 查看日志

docker logs -f -t --tail 10 镜像名称

docker top 查看容器内进行信息

[root@angrykun ~]# docker top b378829949f4
UID                 PID                 PPID  
root                25104               25086 

docker inspect 查看容器元数据信息

docker inspect 容器Id

docker exec -it 容器Id /bin/bash 进入容器

[root@angrykun ~]# docker exec -it b378829949f4 /bin/bash
[root@b378829949f4 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

docker attach 容器Id
[root@angrykun ~]# docker attach b378829949f4
[root@b378829949f4 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 区别
docker exec  # 进入容器后开启一个新的终端,可以在新终端上操作(常用)
docker attach # 进入容器正在执行的终端,不会启动新的终端

docker cp 拷贝容器内文件至宿主机

[root@angrykun ~]# docker exec -it b378829949f4 /bin/bash
[root@b378829949f4 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@b378829949f4 /]# cd home/
[root@b378829949f4 home]# ls
[root@b378829949f4 home]# touch test.java
[root@b378829949f4 home]# ls
test.java
[root@b378829949f4 home]# exit
exit
[root@angrykun ~]# docker cp b378829949f4:/home/test.java /home
[root@angrykun ~]# ll
total 0
[root@angrykun ~]# cd /home/
[root@angrykun home]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 19 23:50 test.java

docker commit 提交容器成为一个新的镜像

docker commit -a="作者信息" -m="提交的描述信息" 容器Id 目标镜像名:[TAG]je 

可视化

portainer 管理Dokcer可视化面板

docker run -d -p 8080:9200 portainer

容器数据卷

将容器数据持久化到宿主机中,容器之间有一个数据共享的技术。所有的Docker容器内的卷,在没有指定目录的情况下,都在/var/lib/docker/volumes/xxx/_data目录

具名/匿名挂载 容器卷挂载方式

# 具名挂载
-v 卷名:容器内路径
[root@angrykun ~]# docker run -d -P --name nginx02 -v juming:/etc/nginx nginx
323520739b3807fdab74c70b4ed9e148fada85e2bbea0fe2882201c2fe24a26d
[root@angrykun ~]# docker volume ls
DRIVER    VOLUME NAME
local     d246a126aa4aa7dd40818a47062502aba2356ba65cdbaa0b927ccd7f56748d20
local     juming
[root@angrykun ~]# docker volume inspect juming
[
   {
       "CreatedAt": "2021-11-22T23:47:12+08:00",
       "Driver": "local",
       "Labels": null,
       "Mountpoint": "/var/lib/docker/volumes/juming/_data",
       "Name": "juming",
       "Options": null,
       "Scope": "local"
   }
]

# 匿名挂载
-v 容器内路径
[root@angrykun ~]# docker run -d -P --name nginx -v /etc/nginx nginx
fced79b6b3ac5b6b48630c23388ec95f025e83c741ba27c2309c5109c0b2ea82
[root@angrykun ~]# docker volume ls
DRIVER    VOLUME NAME
local     d246a126aa4aa7dd40818a47062502aba2356ba65cdbaa0b927ccd7f56748d20

# 如何确定挂载方式
-v 容器内路径 # 匿名内挂载
-v 卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器路径 # 指定路径挂载,一般宿主机中以/开头

# 拓展,通过 -v 容器内路径: ro  rw 改变读写权限
ro readonly # 只读,容器内只读,可以在宿主机中操作
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

数据共享 多个容器共享文件

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是把数据持久化到本地后,本地数据不会删除。

--volumes-from 容器名

# 多个mysql实现数据共享
[root@angrykun ~]#  docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@angrykun ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

Dockerfile

dockerfile是用来构建docker镜像文件的命令参数脚本。

构建步骤:

1、编写dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 运行进行

4、docker push 发布镜像(DockerHub、阿里云镜像仓库)

Dockerfile构建过程

基础知识:

1、每个保留关键字(指令)都必须是大写字母

2、执行从上到下顺序执行

3、# 表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交

Dockerfile指令

FROM        # 基础镜像
MAINTAINER  #维护者信息,姓名+邮箱

发布镜像

1、注册DockerHub账户

2、在服务器上提交自己的镜像


[root@angrykun ~]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

# 提交镜像

docker push 仓库名/镜像名:tag

docker push angrykun/centos:1.0

Docker网络

docker network ls 查看所有网络

[root@angrykun ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ce9fc88ec872   bridge    bridge    local
6b4e9353507d   host      host      local
c864e96f3e2e   none      null      local

网络模式

  • bridge: 桥接模式,docker默认使用bridger模式
  • none: 不配置网络
  • host: 和宿主机共享网络
  • container: 容器网络连通(用的少,局限性很大)

测试

# 我们直接启动的命令,会默认在命令加上 --net birdge 这个就是docker0
docker run -d -P --name tomact01 tomact
docker run -d -P --name tomact01 --net bridge tomact
# docker0 特点:默认的网络模式,域名不能访问,容器间使用 --link 可以打通容器

#自定义网络
[root@angrykun ~]# docker network create --driver bridge  --subnet 192.168.0.0/16 --gateway 192.168.0.1  mynet
[root@angrykun ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "ce164197f2cfcd3ebb7d8ec7a4395376c3ecb36d93f96bf7d7854e8c762fbe78",
        "Created": "2021-11-28T13:31:53.740209968+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]


docker network connect 网络连通

实战:部署Redis集群


# 创建redis网络
[root@angrykun ~]# docker network create redis --subnet 172.38.0.0/16

# 创建redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF >/mydate/redis/node-${port}/confg/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bust-port 16379
appendonly yes
EOF
done


posted @ 2022-01-23 15:53  angrykun  阅读(139)  评论(0)    收藏  举报