Docker介绍

Docker是什么?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
这篇主要讲述docker在镜像,容器和网络的部分命令

思维导图


一、镜像的基本管理和使用
(1)查看镜像列表
可以使用docker images命令来列出本地主机上的镜像。

[root@master ~]#./image.sh
[root@master ~]# docker images
REPOSITORY     TAG         IMAGE ID      CREATED       SIZE
nginx          latest      540a289bab6c  7 days ago    126MB
centos         latest      0f3e07c0138f  4 weeks ago   220MB
busybox        latest      19485c79a9bb  7 weeks ago   1.22MB
registry       latest      f32a97de94e1  7 months ago  25.8MB
httpd          2.2.32      c51e86ea30d1  2 years ago   171MB

各个选项说明:
REPOSITORY:表示镜像的仓库源。
TAG:镜像的标签。
IMAGE ID:镜像ID。
CREATED:镜像创建时间。
SIZE:镜像大小。

(2)获取镜像
 # docker pull [OPTIONS] NAME[:TAG|@DIGEST]
1
OPTIONS说明:
-a:拉取所有tagged镜像。
–disable-content-trust:忽略镜像的校验,默认开启。

(3)查找镜像
# docker search [OPTIONS] TERM
1
例如,需要一个httpd镜像作Web服务时,可以使用docker search命令搜索httpd来寻找适合的镜像。

[root@master ~]# docker search --filter=stars=10 java
NAME    DESCRIPTION                           STARSOFFICIAL AUTOMATED
node    Node.js is a JavaScript-based platform for s… 8010    [OK] 
tomcat  Apache Tomcat is an open source implementati… 2549    [OK]
java    Java is a concurrent, class-based, and objec… 1976    [OK] 
openjdk OpenJDK is an open-source implementation of … 1947 

参数说明:
NAME:镜像仓库源的名称。
DESCRIPTION:镜像的描述。
OFFICIAL:是否是Docker官方发布。
stars:类似GitHub里面的star,表示点赞、喜欢的意思。
AUTOMATED:自动构建。

(4)删除镜像
# docker rmi [OPTIONS] IMAGE  [REPOSITORY:TAG]
1
OPTIONS说明:
-f:强制删除。
–no-prune:不移除该镜像的过程镜像,默认移除。

二、容器的基本管理和使用
代码如下(示例):

(1)运行容器
运行第一个容器,执行以下命令。

[root@master ~]# docker run -it --rm -d -p 80:80 nginx:latest
1
参数说明:
-i:交互式操作。
-t:终端。
-rm:容器退出后随之将其删除,可以避免浪费空间。
-p:端口映射。
-d:容器在后台运行。
启动容器

# docker start [CONTAINER ID]
1
(2)操作容器
列出运行中的容器。

# docker ps
# docker container ls
1
2
列出所有容器(包含终止状态)。

# docker ps -a
1
查看具体容器的信息。

# docker inspect [container ID or NAMES]
1
查看容器的使用资源状况。

# docker stats [container ID or NAMES]
1
查看容器日志。

# docker logs [OPTIONS] [container ID or NAMES]
1
OPTIONS说明:
–details:显示更多的信息。
-f,–follow:跟踪实时日志。
–sincestring:显示自某个timestamp之后的日志,或相对时间,如42分钟。
–tailstring:从日志末尾显示多少行日志,默认是all。
-t,–timestamps:显示时间戳。
–until string:显示自某个timestamp之前的日志,或相对时间,如42分钟。
进入容器。

# docker exec -it [CONTAINER ID] bash
1
进入容器后,输入exit或者按Crtl+C键即可退出容

(3)终止容器
删除终止状态的容器。

# docker rm [CONTAINER ID]
1
删除所有处于终止状态的容器。

# docker container prune
1
删除未被使用的数据卷。

# docker volume prune
1
删除运行中的容器。

# docker rm -f [CONTAINER ID]
1
批量停止所有的容器。

# docker stop $(docker ps -aq)
1
批量删除所有的容器。

# docker rm $(docker ps -aq)
1
终止容器进程,容器进入终止状态。

# docker container stop [CONTAINER ID]
1
(4)导入/导出容器
将容器快照导出为本地文件。

# docker export [CONTAINER ID] > [tar file]
1
将容器快照导出为本地文件。

# docker export [CONTAINER ID] > [tar file]
1
三、 构建自定义镜像
(1)docker commit
docker commit命令用于从容器创建一个新的镜像,其语法如下:

# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
1
OPTIONS说明:
-a:提交的镜像作者。
-c:使用Dockerfile指令来创建镜像。
-m:提交时的说明文字。
-p:在commit时,将容器暂停。

(2)Dockerfile
Dockerfile是一个文本文档,其中包含了组合映像的命令,可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。
8
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指
向文件系统中任何位置的Dockerfile,其语法如下:

# docker build -f /path/to/a/Dockerfile
1
Dockerfile一般分为4部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时
执行指令,“#”为Dockerfile中的注释。
Dockerfile主要指令如下:
FROM:指定基础镜像,必须为第一个命令。
MAINTAINER:维护者信息。
RUN:构建镜像时执行的命令。
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
CMD:构建容器后调用,也就是在容器启动时才进行调用。
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去“application”,只使用参数。
LABEL:用于为镜像添加元数据。
ENV:设置环境变量。
EXPOSE:指定与外界交互的端口。
VOLUME:用于指定持久化目录。
WORKDIR:工作目录,类似于cd命令。
USER:指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可通过该命令指定运行用户。
ARG:用于指定传递给构建运行时的变量。
ONBUILD:用于设置镜像触发器。
接下来以centos:latest为基础镜像,安装jdk1.8并构建新的镜像centos-jdk。
新建文件夹用于存放JDK安装包和Dockerfile文件。

[root@master ~]# mkdir centos-jdk
[root@master ~]# mv jdk/jdk-8u141-linux-x64.tar.gz ./centos-jdk/ 
[root@master ~]# cd centos-jdk/

编写Dockerfile。

[root@master centos-jdk]# cat Dockerfile 
# CentOS with JDK 8
# Author   Guo
# 指定基础镜像
FROM centos
# 指定作者
MAINTAINER Guo
# 新建文件夹用于存放jdk文件
RUN mkdir /usr/local/java
# 将JDK文件复制到镜像内并自动解压
ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/
# 创建软链接
RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH

使用docker build命令构建新镜像。

[root@master centos-jdk]# docker build -t="centos-jdk" .
1
查看构建的新镜像。

[root@master centos-jdk]# docker images
REPOSITORY     TAG         IMAGE ID       CREATED          SIZE
centos-jdk     latest      bdf402785277   11 minutes ago   596MB

使用新构建的镜像运行容器验证JDK是否安装成功。

[root@master centos-jdk]# docker run -it centos-jdk /bin/bash
[root@2f9219541ca6 /]# java -version
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
[root@2f9219541ca6 /]#

可以发现JDK已经安装成功了,至此,使用Dockerfile构建镜像已完成。

四、网络
查看原生网络

[root@master ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5226646e4d8e        bridge              bridge              local
d32a6151a2b9        host                host                local
5c2396bdb3ef        none                null                local

Docker默认网络模式是bridge模式, docker0网桥是在docker daemon启动时自动创建的,之后创建的docker容器都会在docker0自网范围内选取一个未占用的ip并连接到docker0网桥上,docker0以veth pair连接各容器的网络,容器中的数据通过docker0网桥转发到eth0网卡上。
创建一个busybox,网络为bridge,并展示网络详情

[root@master ~]# docker run -it --network=bridge busybox
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
创建一个busybox,网络为host,并展示网络详情

[root@master ~]# docker run -it --network=host busybox  
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:2c:71:a7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.20/24 brd 192.168.100.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe2c:71a7/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue 
    link/ether 02:42:e1:59:03:2f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:e1ff:fe59:32f/64 scope link 
       valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue 
    link/ether f6:00:ad:a2:09:58 brd ff:ff:ff:ff:ff:ff
    inet 10.16.0.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::f400:adff:fea2:958/64 scope link 
       valid_lft forever preferred_lft forever
5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue qlen 1000
    link/ether ae:2f:25:2d:b7:55 brd ff:ff:ff:ff:ff:ff
    inet 10.16.0.1/24 scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::ac2f:25ff:fe2d:b755/64 scope link 
       valid_lft forever preferred_lft forever
6: veth326e6518@docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 
    link/ether aa:e1:c6:81:29:03 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::a8e1:c6ff:fe81:2903/64 scope link 
       valid_lft forever preferred_lft forever
7: veth5738bd9a@docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 
    link/ether 32:00:87:d9:08:2f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::3000:87ff:fed9:82f/64 scope link 
       valid_lft forever preferred_lft forever
8: vethb720dbc7@docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 
    link/ether 26:1a:9d:09:cf:54 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::241a:9dff:fe09:cf54/64 scope link 
       valid_lft forever preferred_lft forever
none模式是指禁用网络功能,只有lo接口,在容器创建时使用。
创建一个busybox,网络为none,并展示网络详情

[root@master ~]# docker run -it --network=none busybox
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
————————————————
版权声明:本文为CSDN博主「mhcwz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_67818525/article/details/124433487

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值