Docker学习笔记

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docket官网

一、安装与卸载

官方文档

  1. 卸载旧版本

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  2. 安装yum-utils软件包(提供yum-config-manager 实用程序)。

    sudo yum install -y yum-utils
    
  3. 设置阿里云的镜像仓库。

    sudo yum-config-manager \
        --add-repo \
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  4. 更新yum软件包索引

    sudo yum makecache fast  # CentOS7
    sudo yum makecache  # CentOS7
    
  5. 安装最新版DOCKER引擎

    sudo yum install docker-ce docker-ce-cli containerd.io -y
    
  6. 启动Docker。

    sudo systemctl start docker
    
  7. 查看docker版本

    sudo docker version
    
  8. 关闭docker

  9. 卸载Docker Engine,CLI和Containerd软件包:

    sudo yum remove docker-ce docker-ce-cli containerd.io
    
  10. 主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:

    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd
    

二、开启阿里云镜像加速

  1. 进入阿里云官网

  2. 登录

  3. 进入控制台
    在这里插入图片描述

  4. 进入容器镜像服务
    在这里插入图片描述

  5. 找到配置
    在这里插入图片描述

  6. 执行配置

三、常用命令

官方文档

在这里插入图片描述

docker version
docker info

docker images [-aq]
docker tag id xxx[:tag]
docker search mysql [--filter=stars=3000]
docker pull mysql
docker rmi ${docker images -aq}

docker run mysql
docker start id
docker kill id
docker ps [-a]
docker rm -f $(docker ps -aq)

docker logs -nft 10 id
docker top id
docker inspect id
docker stats [id]

ctrl + p + q
exit
docker exec -it id /bin/bash
docker attach id
docker cp

docker commit -a "作者" -m "描述" tomcat01 tomcat01:1.0

docker volume ls

docker history id
docker build -f dockerfile -t 镜像名称:版本 .

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network ls
docker network inspect mynet

docker-compose up [-d] [--build]
docker-compose ps
docker-compose stop
docker-compose down [--volumes]
docker run -d --name es01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch

docker run -d --name mysql01 -p 3306:3306 -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql

四、可视化

1、portainer

  1. 启动

    docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    
  2. 访问:192.168.10.129:900
    在这里插入图片描述

  3. 创建用户
    在这里插入图片描述

  4. 连接本地
    在这里插入图片描述

  5. 进入
    在这里插入图片描述

五、容器数据卷

将容器内的某个目录与linux的某个目录进行挂载(绑定)后,当其中一方的文件夹或文件发生变化后,另一个也会同步产生变化,并且数据同步与容器是否启动无关

删除容器对挂载的linux目录无影响

容器与容器之间也可以通过数据卷容器实现数据共享。

-v linux目录路径:容器目录路径 [-ro]
-v 容器数据卷名:容器目录路径 [-rw]
新容器 --volumes-from 以前的容器

六、Dockerfile

用来构建docker镜像的脚本文件。

1、编写脚本

在这里插入图片描述
在这里插入图片描述
CentOS 的官方 Dockerfile
在这里插入图片描述

自定义tomcat的Dockerfile

FROM centos
MAINTAINER xxx<xxx@163.com>

WORKDIR /usr/local

ADD apache-tomcat-10.0.4.tar.gz /usr/local/
ADD jdk-8u271-linux-x64.tar.gz /usr/local/

ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.4
ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.4
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-10.0.4/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.4/bin/logs/cataline.out

2、构建镜像

docker build [-f Dockerfile] -t mytomcat[:tag] .

3、发布

docker login -u xxx
docker push xxx/xxx[:tag]

docker login --username=****** registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/*****/****:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/*****/****:[镜像版本号]

七、网络

1、docker0

在这里插入图片描述

[root@lingxiao ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ed:c2:ae brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.129/24 brd 192.168.10.255 scope global noprefixroute dynamic ens32
       valid_lft 1711sec preferred_lft 1711sec
    inet6 fe80::f9d1:8a58:ad19:f1ca/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:10:44:f2:db 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:10ff:fe44:f2db/64 scope link
       valid_lft forever preferred_lft forever
[root@lingxiao ~]# docker run -d --name tomcat01 -P tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
b9a857cbf04d: Pull complete
d557ee20540b: Pull complete
3b9ca4f00c2e: Pull complete
667fd949ed93: Pull complete
661d3b55f657: Pull complete
511ef4338a0b: Pull complete
a56db448fefe: Pull complete
00612a99c7dc: Pull complete
326f9601c512: Pull complete
c547db74f1e1: Pull complete
Digest: sha256:94cc18203335e400dbafcd0633f33c53663b1c1012a13bcad58cced9cd9d1305
Status: Downloaded newer image for tomcat:latest
3689ba8c5371fb25dcc2cc69897296c8ed72a44b44ed4a5678fde7438fd3979d
[root@lingxiao ~]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@lingxiao ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=69.7 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.063 ms
^C
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.060/23.281/69.721/32.838 ms
[root@lingxiao ~]# docker run -d --name tomcat02 -P tomcat
bf16e1642900fdc3e692ac80e82e9437f3f0900b844f73a874de4680f4703b2f
[root@lingxiao ~]# docker exec -it tomcat02 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.202 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.219 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.478 ms
^C
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.202/0.299/0.478/0.127 ms
[root@lingxiao ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ed:c2:ae brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.129/24 brd 192.168.10.255 scope global noprefixroute dynamic ens32
       valid_lft 1255sec preferred_lft 1255sec
    inet6 fe80::f9d1:8a58:ad19:f1ca/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:10:44:f2:db 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:10ff:fe44:f2db/64 scope link
       valid_lft forever preferred_lft forever
11: vethaa1610c@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 6a:09:9b:7e:2d:87 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::6809:9bff:fe7e:2d87/64 scope link
       valid_lft forever preferred_lft forever
13: vethab9ca80@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 52:c4:08:20:2d:49 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::50c4:8ff:fe20:2d49/64 scope link
       valid_lft forever preferred_lft forever
[root@lingxiao ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
841e448672cd401db7cf6c17756f9d88bb7b26e61cc2a0a53fcc831b26530d6a
[root@lingxiao ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
[root@lingxiao ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.237 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.162 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.125 ms
^C
--- tomcat02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.125/0.174/0.237/0.049 ms
[root@lingxiao ~]#

2、自定义网络

优点:可以直接通过容器名进行通信

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network ls
docker network inspect mynet

3、网络连通

一个容器,多个IP地址

在这里插入图片描述

八、案例

1、redis集群

  1. 创建redis网络

    docker network create redis  --subnet 172.18.0.1/24
    
  2. 查看网络

    docker network ls
    docker network inspect redis
    
  3. 创建节点配置文件并启动

    for port in $(seq 1 6); \
    do \
    mkdir -p /home/redis/node-${port}/conf
    touch /home/redis/node-${port}/conf/redis.conf
    cat << EOF >/home/redis/node-${port}/conf/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.18.0.1${port}
    cluster-announce-port 6379
    cluster-announce-bus-port 16379
    appendonly yes
    EOF
    docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
    -v /home/redis/node-${port}/data:/data \
    -v /home/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.18.0.1${port} redis redis-server /etc/redis/redis.conf
    done
    
  4. 查看启动的容器

    docker ps
    
  5. 进入redis-1

    docker exec -it redis-1 /bin/sh
    
  6. 创建集群

    redis-cli --cluster create 172.18.0.11:6379 172.18.0.12:6379 172.18.0.13:6379 172.18.0.14:6379 172.18.0.15:6379 172.18.0.16:6379 --cluster-replicas 1
    
  7. 连接集群

    redis-cli -c
    
  8. 查看集群情况

    cluster info
    cluster nodes
    

2、springboot

  1. 创建Dockerfile

    FROM java:8
    COPY *.jar /app.jar
    CMD ["--server.port=8080"]
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","/app.jar"]
    
  2. 构建镜像

    docker build -t demo .
    
  3. 运行

    docker run -d -p 8080:8080 --name demo01 demo
    

九、Docker Compose

官方文档

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。

1、安装

官方文档

前提:已安装Docker Engine。

  1. 下载Docker Compose的当前稳定版本
    DaoCloud可以获取国内下载地址

    # 官网下载
    sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
    # 国内下载
    sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.28.6/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
  2. 赋予文件可执行权限

    sudo chmod +x /usr/local/bin/docker-compose
    
  3. 测试-查看版本

    docker-compose version
    

2、官方案例

1)、计数器

官方文档

2)、WordPress

官方文档

3、docker-compose.yml

版本3官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值