note-docker

docker

docker官网:https://www.docker.com/

Docker文档地址https://docs.docker.com/

仓库地址:https://hub.docker.com/

安装Docker

安装

img

卸载旧的版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

需要的安装包

yum install -y yum-utils

设置镜像仓库

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的不要安装
    
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云镜像

安装docker相关的东西 docker社区

yum makecache fast #更新
yum install docker-ce docker-ce-cli containerd.io

启动docker

systemctl start docker

查看版本

docker version

测试

docker run hello-world

卸载docker

# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker
# /var/lib/docker  docker默认的工作路径

基础命令

镜像命令

docker version

docker info

docker 命令 --help

帮助文档地址:https://docs.docker.com/reference/

docker images 查看所有本地主机上的镜像

docker search 搜索镜像

docker pull 下载镜像

docker rmi -f 删除镜像

docker save 镜像打包

docker load 加载镜像

容器命令

docker pull centos

docker run 启动命令

docker run [可选参数] image
# 参数说明
-- name " Name" 容器名字  tom1 tom2 用来区分容器
-d      后台运行方式运行
- it  使用交互方式运行,进入容器内查看内容
-p  指定容器的端口 -p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口
    -p 容器端口
-p 随机指定端口  

docker ps 列出正在运行的镜像

快捷键:ctrl+p+q 容器不停止退出

docker rm 删除容器

docker start 容器id #启动容器

docker restart 容器id #重启容器

docker stop 容器id #停止正在运行的容器

docker kill 容器id #强制停止正在运行的容器

后台启动容器

# 命令:docker run -d 镜像名
[root@localhost ~]# docker run -d cenos
#问题 docker ps 发现centos 停止了
# 常见的坑: docker容器使用后台运行,就必须要有要一个前台进程, docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序

docker logs 查看日志

# 参数
-tf 显示日志
--tail number #显示日志条数
[root@localhost ~] docker logs -tf --tail 10 6bdfe1b2e2ba #显示指定行数的日志

查看容器中进行信息

docker top 6bdfe1b2e2ba

docker inspect 容器id

进入当前正在运行的容器

# 我们通常都是后台方式运行,需要进入容器修改一些配置
#命令
#方式一
[root@localhost ~]docker exec -it 容器id /bin/bash
#方式二
[root@localhost ~] docker attach 容器id
#docker exec #进入容器后 开启一个新的终端 可以在里面操作(常用)
#docker attach #进入容器正在执行的终端 不会启动新的进程

docker exec语法

指定工作目录执行命令

docker exec -it -w /usr tomcat7 pwd

以 root 用户身份进入容器(重点)

docker exec -it -uroot jenkins1 bash

从容器拷贝文件到主机上

docker cp 容器id:容器内路径:目的地的主机路径

小结

img

img

img

Commit镜像

docker commit 提交一个容器成为一个副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

慎用 docker commit

使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。

首先,如果仔细观察之前的 docker diff webserver 的结果,你会发现除了真正想要修改的 /usr/share/nginx/html/index.html 文件外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。

此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。

而且,镜像所使用的分层存储,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

使用数据卷

方式一: 直接使用命令来挂在 -v

docker run -it -v 主机目录:容器内目录 
docker run -it -v /home/ceshi:/home centos /bin/bash
# 启动起来后可以通过 docker inspect 容器id

具名和匿名挂载

# 匿名挂载
-v 容器内路径
docker run ----name nginx01-v /ect/nginx nginx
# 查看所有的volume的情况
docker volume ls
local               a52012ac555e544f2745377e706cef77ac1977974f571d534a444e85f969d7a0
# 具名挂载
docker run ----name nginx01-v juming-nginx:/ect/nginx nginx
# 查看具名
docker volume inspect juming-nginx
如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-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
#ro:只要看到ro就说明该个径只能通过宿王机来操作,容器内部是无法操作

数据卷容器

容器之间的数据同步

img

-- volumes-from
# 启动3个容器测试
docker run -d -it --name docker01 centos
docker run -d -it --name docker02 --volumes-from docker01 centos
docker run -d -it --name docker03 --volumes-from docker02 centos

docker01的数据同步到docker02
docker02的数据同步到docker03
相当于继承关系

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:5.7 
docker run -d -p 3306:3306  -e MYSQL_ROOT_PASSWORD=1234 --name mysql02 --volumes-from mysql01 mysql:5.7

结论
容器之间配信息的传递,数据着容器的生命周期一直持续到没有容器使用为止
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

DockerFile

基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交

DockerFile指令

FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的 姓名+邮箱
RUN #构建镜像的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR# 镜像工作的目录
VOLUME #挂载目录
EXPOSE #暴露端口
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承Dockerfile这个时候就会运行 ONBUILD的指令。触发指令
COPY #类似ADD,我们文件持贝到镜像中
ENV #构建的时候设环境变量!

img

Docker Hub中99%镜像都是从这个基础镜像过来的 FROM scratch 然后配需要的软件和配置来进行的构建

构建镜像

docker build -f dockerfile文件地址  -t 镜像名称:[版本] .
#最后有一个.

实例

使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。

docker build github.com/creack/docker-firefox

列出镜像的历史

docker history 镜像id

发布自己的镜像

注册自己的账号

1、注册账号:https://hub.docker.com/
2、确定这个这账号可以登录
3、在我们服务器上提交自己的像

[root@localhost local]# clear
[root@localhost local]# 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
[root@localhost local]# 
docker login -u 用户名 -p 密码
-u 用户名
-p 密码

上传镜像docker Hub

[root@localhost local]# docker push diytomcat:1.0 
The push refers to repository [docker.io/library/diytomcat]
61419540ca7d: Preparing 
943a150b53e6: Preparing 
2ac8360636d3: Preparing 
291f6e44771a: Preparing 
denied: requested access to the resource is denied #被拒绝
[root@localhost local]#

发现上传的时候被拒绝了,更改名称 携带额外的信息

docker tag 镜像id docker地址

docker tag 6eb45446d0c2 2332810801/tomcat
docker push 2332810801/tomcat

Docker网络

image-20210825141343998

image-20210825141432744

结论: tomcat01和 tomcat02是公用的一个路由器, docker0

所有的容器不指定网络的情况下,都是 docker0路由的, docker0会给我们的容器分配一个默认的可用IP

docker run -d -P --name tomcat01 tomcat
docker run -d  -P --name tomcat03 --link tomcat01 tomcat
docker exec -it tomcat03 ping tomcat01
#其实这个 tomcat03就是在本地配置了 tomcat01的配置
docker exec -it tomcat01 cat /etc/hosts

image-20210825142458580

现在玩Docker已经不建议使用link了
自定义网络!不用 docker!
docker0问题:他不支持容器名连接访问!

自定义网络

docker network ls 查看所有的docker网络

网络模式
bridge:桥接 docker(默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通!(用的少!)

创建自定义网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway  192.168.0.1 mynet
[root@192 ydoc]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "2cfa03bb368ffc8f7427252fd686a2898556f2bf5b2b1080a821a00f7e997670",
        "Created": "2021-08-25T14:32:26.55684087+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.166.0.0/16",
                    "Gateway": "192.166.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "83598e516c11f77142b8a59d87f42f6d6b444b2c2879657ad49193bb8e51e5ba": {
                "Name": "tm01",
                "EndpointID": "a881bb8034040fa347baf9ded320eee792eb599006225a765fd0314bc107a770",
                "MacAddress": "02:42:c0:a6:00:02",
                "IPv4Address": "192.166.0.2/16",
                "IPv6Address": ""
            },
            "f45d372ced29ddd3b70d2b18b2e817e0151f006d8c776bf195c862b654b31c6a": {
                "Name": "tm02",
                "EndpointID": "34ec5f2edcc75b49d827a4bc534a7eaf600320b784aef430b7621a2409df0bda",
                "MacAddress": "02:42:c0:a6:00:03",
                "IPv4Address": "192.166.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
[root@192 ydoc]# 

网络连通

docker network connect mynet tomcat01
posted @ 2022-04-15 09:51  yy9knsg  阅读(54)  评论(0)    收藏  举报