Docker常用操作

安装前准备:一个centos服务器,操作系统版本必须在3.10及以上
uname -r:查看操作系统的发行版本

目录

一、Docker的安装、卸载

1.安装Docker

2.启动、暂停、重启Docker

3.卸载Docker 

二、Docker常用命令

1.Docker的帮助命令

2.镜像常用命令

3.容器常用命令

4.Docker的常用命令

5.将容器制作成镜像

6.目录挂载的三种方式

三、DockerFile

1.DockerFile概念

2.使用DockerFile脚本制作一个centos

3.CMD和ENTRYPOINT的区别

四、将本地制作好的镜像推送到阿里云私人仓库

1.登陆阿里云,在控制台搜索容器镜像服务

2.2.创建个人版实例,并设置密码

3.创建一个命名空间

4.创建一个镜像仓库,并选择本地仓库

5.根据提示向阿里云私人仓库推送拉取镜像

6.推送完成后可在镜像版本中查看

五、Docker网络

1.概念

2.同一网段下宿主机与容器、容器与容器之间的ip是可以ping通的

2.使用容器名测试容器与容器之间的网络连通性

3.使用使用 --link参数实现同一网络下容器之间单向连接

4.使用network命令实现同一网络下容器之间双向的互通

5.不同网络之间容器的连通


一、Docker的安装、卸载

1.安装Docker

1.删除旧版本docker 
yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

2.安装gcc环境
yum -y install gcc
yum -y install gcc-c++

3.配置docker仓库:(这儿用的是国内阿里云的仓库)
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.更新yum索引
yum makecache fast

5.安装docker
yum install -y docker-ce docker-ce-cli containerd.io

6.启动docker
systemctl start docker

7.配置镜像加速:此处采用的阿里云的:(登录自己的阿里云账号,找到控制台-容器镜像服务-镜像工具-镜像加速器)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pdg27cfz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

--------至此:docker就安装成功了--------

8.查看docker版本
docker --version

2.启动、暂停、重启Docker

1.查看docker运行状态
systemctl status docker

2.启动docker
systemctl start docker

3.停止docker
systemctl stop docker

4.重启docker
systemctl restart docker

注意:
如果执行"停止docker命令"后报下面这句话不用理会,这是docker自动唤醒机制,它的意思时再次执行任意docker命令就会自动启动docker
Warning: Stopping docker.service, but it can still be activated by:
    docker.socket

3.卸载Docker 

1.停止docker
sudo systemctl stop docker

2.删除上面第5步安装的docker组件
sudo yum remove docker-ce docker-ce-cli containerd.io
 
3.删除docker相关的镜像容器等数据信息
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

二、Docker常用命令

1.Docker的帮助命令

1.查看docker版本信息
    docker --version

2.查看docker详细信息
    docker info

3.docker帮助命令
    docker --help

4.查看某个命令的帮助文档,如images
    docker images --help

2.镜像常用命令

1.搜索镜像
    docker search 镜像名 
    参数:
        --filter=STARS=数量:搜索STARS在多少以上的
    示例:
        1.搜索mysql镜像
        docker search mysql
        2.搜索STARS数在20以上的mysql镜像
        docker search mysql --filter=STARS=20

2.拉取镜像
    docker pull 镜像名
    参数:
        :版本号:拉取指定版本的镜像
    示例:
        1.拉取mysql镜像:默认拉取最新版的
        docker pull mysql
        2.拉取mysql5.7镜像
        docker pull mysql:5.7

3.查看镜像
    docker images
    参数:
        -a:查看所有镜像,默认参数
        -q:只显示镜像id
    示例:
        1.查看所有镜像
        docker images -a
        2.查看镜像id
        docker images -q
        3.查看所有镜像的镜像id
        docker images -aq

4.删除镜像
    docker rmi 镜像id
    参数:
        -f: 强制删除:创建了容器之后不能直接删除镜像,可以加上-f参数强制删除
    
    示例:
        1.删除单个镜像
        docker rmi -f 镜像id
        2.删除多个镜像
        docker rmi -f 镜像1id 镜像2id
        3.删除所有镜像
        docker rmi -f $(docker images -aq)

3.容器常用命令

1.docker run [可选参数] 镜像名
    #参数说明
        1.指定容器名字
        --name 容器名
        2.以后台方式启动
        -d
        3.以交互方式启动
        -it
        4.指定容器端口
        -p 主机端口:容器内端口
        5.随机指定端口
        -P 
 
    示例:
    1.以交互方式运行centos容器
    docker run -it --name mycentos centos /bin/bash

2.退出容器
    exit 退出并停止容器
    Ctrl+P+Q 退出不停止容器

3.docker ps 
    #参数说明
        -a:查看所有容器
        -q:查看容器id
        -n:查看最近运行的n个容器
    示例:
        1.查看正在运行的容器
        docker ps 
        2.查看所有的容器
        docker ps -a 
        3.查看正在运行的容器的id
        docker ps -q 
        4.查看所有的容器id
        docker ps -aq
        5. 列出最近运行的n个容器
        docker ps -n=? 
    
 
4.启动和停止容器
    docker start 容器id //启动退出的容器
    docker restart 容器id //重启容器
    docker stop 容器id    //停止容器
 
5.docker rm  
    #参数说明
        -f 强制删除,正在运行的容器不让删除,必须加上-f参数
    示例:
        1.删除单个容器
        docker rm -f 容器id
        2.删除多个容器
        docker rm -f 容器1id 容器2id
        3.删除所有容器
        docekr rm -f $(docker ps -qa) 
 
6.进入正在运行的容器
    1.docker exec    
        docker exec -it 容器id /bin/bash //以指定终端的方式进入容器,这儿指定的是/bin/bash,也可以是其它的
    2.docker attach     
        docker attach 容器id //进入正在运行的终端

4.Docker的常用命令

1.查看容器的进程
    docker top 容器id

2.查看容器的日志
    docker logs 参数 容器id
    #参数
        -t //显示时间
        -f //显示最新日志
        --tail 行数 //显示多少行
    示例:
        这个命令会打印出容器内输出的内容,此时没有服务器打印的日志可以进入容器做些操作模拟
        1.运行一个容器,比如centos
            docker run -it --name mycentos centos /bin/bash
        2.进行服务器操作
            ls
            cd /home
            mkdir test
            cd test
            touch test.txt
        3.Ctrl+P+Q退出容器
        4.查看日志
            docker logs 容器id 

3.将容器内文件拷贝到宿主机
    docker cp 容器id:容器内的路径 宿主机的路径

4.查看容器的元数据信息
    docker inspect 容器id或者挂载id

5.查看挂载(容器卷)列表 
    docker volume ls

6.将镜像打包成压缩包
    docker save -o 压缩包名.tar.gz 镜像:版本号

7.从压缩包加载镜像
    docker load -i 压缩包名.tar.gz

8.将DockerFile文件编译成镜像
    docker build -f dockerfile文件 -t 镜像名:版本号 .

9.查看镜像构建历史
    docker history 镜像id

5.将容器制作成镜像

命令:
    docker commit -m="注释信息" -a="作者" 容器id 自定义的镜像名:版本号
 
示例:
    以Tomcat为例:阿里云官方镜像的tomcat,webapps下是没有东西的,所以直接访问找不到页面,自定义一个tomcat,将webapps下东西补全

1.下载镜像
    docker pull tomcat

2.后台运行镜像
    docker run -d --name tomcat -p 8080:8080 tomcat

3.此时浏览器访问是看不到内容的

4.进入容器
    docker exec -it 容器id /bin/bash

5.此时进入webapps目录下,发下目录是空的;将webapps.dist目录下的东西复制到webapps目录下
    cp -r webapps.dist/* webapps/

6.此时外网访问8080就可以访问到内容了

7.将容器提交制作一个自定义的镜像
    docker commit -m="mytomcat" -a="ling" 容器id mytomcat:1.0

8.停止旧容器
    docker stop 容器id

9.运行新创建的镜像
    docker run -d -p 8080:8080 mytomcat:1.0

10.浏览器访问8080端口,可以正常访问页面

注意事项:访问不到的记得开启服务商防火墙策略和服务器本地端口

6.目录挂载的三种方式

1:指定宿主机路径挂载:docker volume ls 看不到挂载信息
    格式:
        -v 宿主机路径:容器内路径
    示例:
        1.创建一个centos容器,实现容器和宿主机的目录挂载
            docker run -it -v /home/test:/home/test --name gzcentos centos /bin/bash
        2.在容器内test目录下创建一个test.txt文件,在宿主机/home/test目录下也可以看到这个文件
            touch test.txt
        3.在容器/宿主机内修改文件内容,挂载的双方也都可以看到
        4.在宿主机上停止容器,修改宿主机的文件内容
        5.重启后容器内依然能看到修改后的数据
        6.使用docker inspect 容器id可以看到Mounts下的挂载信息

2.匿名挂载:docker inspect 容器id (Mounts下是看不到挂载信息的)
    格式:
        -v 容器内路径
    示例:
        1.创建一个centos容器,实现容器和宿主机的匿名挂载
            docker run -it -v /home/test1 --name nmcentos centos /bin/bash
        2.在容器内test1创建一个test1.txt文件
            touch test1.txt
        3.查看挂载列表目录
            docker volume ls
        4.查看挂载目录
            docker inspect 挂载id
        5.此时看到了挂载到的宿主机目录,也实现了容器跟宿主机目录的挂载
        
    
3.具名挂载:(docker volume ls 和docker inspect 容器id 都能看到挂载信息) 
    格式:
        -v 卷名:容器内路径
    示例:
        1.创建一个centos容器,实现容器和宿主机的具名挂载
            docker run -it -v jmcentos:/home/test2 --name jmcentos centos /bin/bash
        2.在容器内test2目录下创建一个test1.txt文件
            touch test2.txt
        3.查看挂载目录
            docker inspect 容器id
        4.此时看到了挂载到的宿主机目录,也实现了容器跟宿主机目录的挂载
            
注意:通过观察发现,匿名挂载和具名挂载,宿主机目录都在下面目录下
/var/lib/docker/volumes/匿名id或具名/_data

三、DockerFile

1.DockerFile概念

1.概念
    DockerFile是一个命令参数脚本,是用来构建docker镜像的脚本文件

2.构建镜像的步骤
    1.编写一个dockerFile文件
    2.docker build 构建成一个镜像
    3.docker run 运行镜像构建容器
    4.docker push 发布镜像(dockerhub/阿里云镜像仓库等等)

3.DockerFile脚本文件
    1.每个关键字都必须大写
    2.执行从上往下顺序执行
    3.# 表示注释
    4.每个指令都出创建一个新的镜像层并提交

4.dockerFile指令
    FROM        #设置基础镜像,当前镜像是基于哪个镜像的
    MAINTAINER  #镜像作者 姓名<邮箱>
    RUN         #镜像构建的时候需要运行的命令
    ADD         #将宿主机目录中的文件拷贝到镜像中,压缩包会自动解压
    WORKDIR     #镜像的工作目录,用户一进来就进入的目录
    VOLUME      #挂载的目录
    EXPOSE      #暴露的端口
    CMD         #指定容器启动时运行的命令,run时指定命令会替换掉最后一个CMD命令
    ENTRYPOINT  #指定容器启动时运行的命令,run时指定命令会拼接在最后一个ENTRYPOINT命令后面
    ONBUILD     #触发器,当构建的镜像被另一个dockerFile继承时触发
    COPY        #将文件拷贝到镜像中
    ENV         #构建的时候设置环境变量

2.使用DockerFile脚本制作一个centos

    阿里云的centos是没有vim和ifconfig命令的;使用DockerFile脚本基于centos镜像添加上这两个组件,制作出一个新镜像.

1.创建一个目录用于存放DockerFile脚本(我用root登陆的,就放在root下了,位置无所谓,可以自行选择)
    mkdir /root/DockerFiles/mycentos

2.进入目录
    cd /root/DockerFiles/mycentos

3.创建DockerFile脚本
    touch DockerFile

4.编辑脚本

# 基于centos镜像
FROM centos

# 作者信息
MAINTAINER ling<xxx@163.com>

# 环境定义了个MAINPATH
ENV MAINPATH /home/ling
# 工作目录指定了环境变量定义的目录
WORKDIR $MAINPATH

# centos最新镜像没有vim,安装会失败解决方案
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

RUN yum makecache
RUN yum update -y

#安装vim和net-tools
RUN yum -y install vim
RUN yum -y install net-tools

#输出信息
CMD echo $MAINPATH
CMD echo "---------build end---------"
CMD /bin/bash

5.使用docker build将DockerFile脚本构建成镜像
    docker build -f DockerFile -t mycentos:1.0 .

6.运行镜像
    docker run -it --name mycentos mycentos:1.0 /bin/bash

7.测试vim和ifconfig功能

3.CMD和ENTRYPOINT的区别

CMD:运行镜像时添加的参数会替换掉最后一条CMD命令
ENTRYPOINT:运行镜像时添加的参数会拼接在最后一条ENTRYPOINT命令后面成为一条新的命令

1.CMD命令测试

# 编写一个Dockerfile文件
FROM centos

# docker run执行以后,你想要添加新命令参数,无法直接添加,而是需要编写完整的命令,CMD的使用
CMD ["ls","-a"]

# 构建成一个镜像
docker build -f DockerFile文件 -t 镜像名:版本号 .

# 运行测试
docker run 镜像id -l //执行失败,此时实际执行的是 -l
docker run 镜像id ls -al //执行成功

2.ENTRYPOINT命令测试

# 编写一个Dockerfile文件
FROM centos

# docker run传递参数的时候,拼接到 ENTRYPOINT 指令中,不传就是执行默认的
ENTRYPOINT ["ls","-a"]

#构建成一个镜像
docker build -f dockerfile文件 -t 镜像名:版本号 .

#运行测试
docker run 镜像id -l //执行成功

四、将本地制作好的镜像推送到阿里云私人仓库

1.登陆阿里云,在控制台搜索容器镜像服务

2.2.创建个人版实例,并设置密码

3.创建一个命名空间

4.创建一个镜像仓库,并选择本地仓库

5.根据提示向阿里云私人仓库推送拉取镜像

6.推送完成后可在镜像版本中查看

五、Docker网络

由于容器的每次启动,宿主机和容器之间就会分配一对新的ip;为方便观察学习,这儿先清空了本地的镜像和容器

# 清空容器

docker rm -f $(docker ps -aq)

# 清空镜像

docker rmi -f $(docker images -aq)

1.概念

1.在宿主机先用ip addr命令查看下网络信息;此时可以看到本地回环地址、网卡、docker0三个网段,其中docker0网段是docker默认的网络.

2.由于docker0网段是docker的默认网络,所以启动容器时不指定网络的情况下,默认都会分配在docker0网络下;由于容器在同一个网段下,所以容器之间网络也是互通的.

2.同一网段下宿主机与容器、容器与容器之间的ip是可以ping通的

示例1:
    测试宿主机与容器之间网络的连通性
        1.启动一个容器:[此处测试用的是centos镜像,镜像是什么无所谓,可以自行选择;当然,有些容器中没有ip addr命令,需要进行安装]
            docker run -itd --name centos01 centos /bin/bash
        2.宿主机输入 ip addr命令可以看到多了一个网络信息
            ip addr
        3.进入容器
             docker exec -it 容器id /bin/bash
        4.容器内输入 ip addr命令查看网络信息,可以看到一个ip地址
             ip addr
        5.退出容器
            Ctrl+P+Q
        6.测试宿主机和容器之间的网络连通性
            ping 容器id地址
        结论:如果操作没有问题,此时网络应该可以看到是连通的
示例2:
    测试容器与容器之间网络的连通性
        1.再启动一个容器
            docker run -it --name centos02 centos /bin/bash
        2.在容器内输入 ip addr命令,此时可以看到,centos01和centos02容器在同一个网段下
            ip addr
        3.测试容器centos01和容器centos02之间的网络连通性
            ping centos01容器的地址
        结论:如果操作没有问题,此时网络应该也可以看到是连通的
        
问题:由于每次容器重启都会分配一个新的ip,所以使用容器安装数据库这些软件,容器挂掉了重启后ip就变了,那连接ip应该写什么呢?

解决:使用容器名进行连接

2.使用容器名测试容器与容器之间的网络连通性

1.在centos01输入 
    ping centos02

2.在centos02输入 
    ping centos01

3.在宿主机输入(宿主机和容器之间使用容器名是无法ping通的,无需解决)
    ping centos01
    ping centos02
        
问题:此时发现所有的都ping不通,那应该怎么解决呢?
解决:使用--link参数或network命令

3.使用使用 --link参数实现同一网络下容器之间单向连接

格式:
    --link 要连接到的容器名

    1.创建一个新容器连接到之前的容器
        docker run -it --name centos03 --link centos02 centos /bin/bash

    2.测试centos03与centos02的网络连通性
        ping centos02 这个是可以连通的
        ping centos01 这个是没有连通的

    3.进入centos02容器测试与centos03容器的连通性
        docker exec -it centos02容器id /bin/bash
        ping centos03 这个是没有连通的

    4.重启centos02 
        docker restart centos02容器id

    5.此时centos02容器的ip地址没有改变,在centos03中依旧能ping通
    
    6.实际上就是在centos03容器的/etc/hosts文件中增加了一条映射信息
        cat /etc/hosts

docker0网络的特点:
    1.默认网络:容器不指定网络就是docker0网络
    2.无法通过容器名访问

问题:此时就只创建了centos03容器到centos02容器的一个正向的连接;反向也是ping不通的,[不推荐使用]
解决:使用network命令实现容器之间双向的互通

4.使用network命令实现同一网络下容器之间双向的互通

网络模式一共有以下几种
        bridge模式       --net=bridge             默认值,docker0使用的就是这个 
        自定义网络      --net=自定义网络         用户自定义网络,创建容器的时候可以添加这个参数指定自定自己的网络
        host模式          --net=host               容器和宿主机共享网络
        none模式         --net=none               不配置网络,用户可以进入容器后自行配置网络信息  
        container模式  --net=container:name/id  容器和另外一个容器共享Network namespace, kubernetes中的pod就是多个容器共享一个Network namespace.

1.自定义一个网络
    # 格式:docker network create --driver 模式 --subnet 网段 --gateway 网关 网络名
    docker network create --driver bridge --subnet 172.16.0.0/16 --gateway 172.16.0.1 mydockernet

2.查看网络列表,可以看到多了一个自定义的网络
    docker network ls

3.创建容器指定网络为自定义的网络
    docker run -itd --name centos04 --net mydockernet centos /bin/bash

4.再创建一个容器,网络还是指定自定义的网络
    docker run -it --name centos05 --net mydockernet centos /bin/bash

5.在centos05下测试与centos04的网络连通性
    ping centos04的容器ip     //可以连通
    ping centos04            //可以连通

6.在centos04下测试与centos05的网络连通性
    ping centos05的容器ip     //可以连通
    ping centos05            //可以连通

结果:此时就实现了统一网络下容器名网络的连通性问题
注意:数据库等组件连接时,记得将ip替换为容器名

自定义网络使用场景
    1.同一个项目可以自定义一个网络,不同项目之间实现网络隔离效果
    2.统一个服务集群也可以自定义一个网络

5.不同网络之间容器的连通

1.进入centos05容器
    docker exec -it centos05容器的id /bin/bash

2.测试centos05容器与centos01容器的连通性
    ping centos01 //ping不通

3.将centos01容器添加到自定义网络中 格式: docker network connect 网络名 容器名
    docker network connect mydockernet centos01

4.进入centos05容器
    docker exec -it centos05容器的id /bin/bash

5.测试centos05容器与centos01容器的连通性
    ping centos01 //可以ping通

6.进入centos01容器
    docker exec -it centos01容器的id /bin/bash

7.测试centos01容器与centos05容器的连通性
    ping centos05 //可以ping通

# 此时就实现了不同网段下容器之间网络互通

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值