Docker学习笔记
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
一、安装与卸载
-
卸载旧版本
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装yum-utils软件包(提供yum-config-manager 实用程序)。
sudo yum install -y yum-utils
-
设置阿里云的镜像仓库。
sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum软件包索引
sudo yum makecache fast # CentOS7 sudo yum makecache # CentOS7
-
安装最新版DOCKER引擎
sudo yum install docker-ce docker-ce-cli containerd.io -y
-
启动Docker。
sudo systemctl start docker
-
查看docker版本
sudo docker version
-
关闭docker
-
卸载Docker Engine,CLI和Containerd软件包:
sudo yum remove docker-ce docker-ce-cli containerd.io
-
主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
二、开启阿里云镜像加速
-
进入阿里云官网
-
登录
-
进入控制台
-
进入容器镜像服务
-
找到配置
-
执行配置
三、常用命令
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
-
启动
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
-
访问:192.168.10.129:900
-
创建用户
-
连接本地
-
进入
五、容器数据卷
将容器内的某个目录与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集群
-
创建redis网络
docker network create redis --subnet 172.18.0.1/24
-
查看网络
docker network ls docker network inspect redis
-
创建节点配置文件并启动
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
-
查看启动的容器
docker ps
-
进入redis-1
docker exec -it redis-1 /bin/sh
-
创建集群
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
-
连接集群
redis-cli -c
-
查看集群情况
cluster info cluster nodes
2、springboot
-
创建Dockerfile
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
-
构建镜像
docker build -t demo .
-
运行
docker run -d -p 8080:8080 --name demo01 demo
九、Docker Compose
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。
1、安装
前提:已安装Docker Engine。
-
下载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
-
赋予文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose
-
测试-查看版本
docker-compose version