docker安装和卸载
安装
#1.卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.安装
#安装所需软件
yum install -y yum-utils
#设置国内镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker-ce:社区版 docker-ce-cli docker客户端
yum install docker-ce docker-ce-cli containerd.io
#重启服务
systemctl restart docker
#查看docker安装是否安装成功
docker version
卸载
#1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2.删除资源 docker 默认工作路径:/var/lib/docker
rm -rf /var/lib/docker
配置阿里云加速器
链接:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ziycotf5.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
帮助命令
docker version #显示docker的版本信息
docker info #显示docker系统的详细信息 包括镜像和容器信息
docker 命令 --help #可以查看命令的帮助信息
镜像操作
1.docker images #查看docker的所有镜像
[root@izbp13a472vhas8t43gozvz ~] docker images #查看docker的所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
zt-api-gateway 1.0-SNAPSHOT 1b21aab993ef 2 days ago 683 MB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像大小
docker images 命令的可选项
-a --all #列出所有镜像
-q --quiet #只显示镜像ID
# 常用 docker images -qa
2.docker search 搜索镜像
docker search 镜像名
[root@izbp13a472vhas8t43gozvz ~] docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 9550 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 3469 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 700 [OK]
#可选项
-f --filter 过滤条件
[root@izbp13a472vhas8t43gozvz ~] docker search mysql --filter=STARS=700
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 9550 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 3469 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 700 [OK]
3.docker pull拉取镜像
docker pull 镜像名
默认是下载latest版本
docker pull mysql
也可以指定下载版本
docker pull mysql:5.0
4.docker rmi镜像删除
# 删除指定容器 -f表示强制删除
docker rmi -f 镜像ID
#删除全部镜像
docker rmi $(docker images -qa)
容器命令
1.启动镜像 :docker run [可选参数] 镜像
#可选参数
-name "容器名称" #启动容器后,容器名称,用来区别同一镜像的多个容器
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容
-p 主机端口:镜像端口 #用于端口映射
-P #随机指定端口
#以交互启动容器 可以进到容器内部对数据进行操作
[root@izbp13a472vhas8t43gozvz ~]# docker run -it 470671670cac
[root@c27c8c188995 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
2.以-it
启动容器,现在退出容器有几种方式
exit #退出容器,并且容器停止运行
Ctrl+P+Q #退出容器的交互模式,容器后台运行
3.查看容器:docker ps [可选参数]
docker ps #查看正在运行的容器 up表示健康正在运行
[root@izbp13a472vhas8t43gozvz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c27c8c188995 470671670cac "/bin/bash" 2 minutes ago Up 2 minutes sad_albattani
docker ps -a #查看所有的容器
docker ps -aq #列出所有容器ID
4.容器删除:docker rm
docker rm 容器名或者容器ID
docker rm -f 容器名或者容器ID
#-f表示强制删除容器,运行状态下也可以删除
docke rm -f $(docker ps -qa)
#删除所有容器
docker ps -aq | xargs docker rm -f
#删除所有容器
5.启动和停止容器
docker start 容器名或者容器ID
#开启容器
docker restart 容器名或者容器ID
#重启容器
docker stop 容器名或者容器ID
#停止容器
docker kill 容器名或者容器ID
#强制停止容器
常用命令
1.后台启动容器命令
docker run -d –name="" 镜像
#使用docker ps
会发现该容器没有工作,因为镜像发现提供服务就会自动停止
2.查看日志命令
docker logs -f —-details -t --tail 行数 容器
可选参数说明
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
3.查看容器进程
docker top 容器
[root@izbp13a472vhas8t43gozvz ~]# docker top zt-re-eu
UID PID PPID C STIME TTY TIME CMD
root 16003 15986 2 19:59 ? 00:00:30 java -jar /app.jar
查看后我们可以在linux下看到该进程,可以kill掉他
[root@izbp13a472vhas8t43gozvz ~]# ps -aux | grep 16003
root 16003 2.4 10.8 2611620 204600 ? Ssl 19:59 0:32 java -jar /app.jar
root 16230 0.0 0.0 112812 968 pts/0 R+ 20:21 0:00 grep --color=auto 16003
4.查看镜像元数据
docker inspect 容器
可以查看容器的详细信息,网络、镜像、容器、挂载目录、、、、等
5.进入容器
以后台方式进入容器
- 方式一 :进入的是他所在的操作系统 要退出来可以使用
Ctrl+p+q
出来后不会停止,会在后台运行
docker exec -it 容器 bash
[root@izbp13a472vhas8t43gozvz ~]# docker exec -it 41ff46e1c4a1 /bash
root@41ff46e1c4a1:/# ls
app.jar bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@41ff46e1c4a1:/#
docker exec -it 容器 /bin/bash
[root@izbp13a472vhas8t43gozvz ~]# docker exec -it 41ff46e1c4a1 /bin/bash
root@41ff46e1c4a1:/# ls
app.jar bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@41ff46e1c4a1:/#
- 方式二:进入这个容器的内部 退出按
crtl+c
会直接停止容器 需要在docker run
创建这个容器时加入-it
参数,这样按Ctrl+p+q
出来后不会停止
docker attach 容器
这个是进入正在运行容器内部
[root@izbp13a472vhas8t43gozvz ~]# docker attach 41ff46e1c4a1
2020-05-27 12:30:39.171 INFO 1 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
6.从容器内拷贝文件到主机上 容器-》主机
不管容器运行不运行只要数据在就可以拷贝出来
docker cp 容器:路径 主机路径
[root@izbp13a472vhas8t43gozvz ~]# docker cp 266ebae21ec9:/app.jar .
[root@izbp13a472vhas8t43gozvz ~]# ls
app.jar
从主机到容器一般使用的是挂载的方式
Docker镜像加载原理
联合文件系统
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
加载原理
docker的境像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
.
bootfst(boot file system)主要包含bootloader
和kernel
,bootloader
主要是引导加载kernel
,Linux
制启动时会加载bootfs
文件系统,在Docker
境像的最底层是bootfs
.这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交始内核,此时系统也会卸载bootfs.
rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
工具
docker图形化管理工具(Portainer)
1.下载镜像
docker pull portainer/portainer
2.启动容器Portainer
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer portainer/portainer
–restart=always 表示当 Docker 重启时,容器自动启动
3.浏览器输入docker宿主机http://IP:9000
commit 镜像
docker commit 镜像名 #提交镜像
docker commit -a 作者名称 -m 提交信息 容器id 目标镜像:tag
如果不加tag就默认是latest
[root@izbp13a472vhas8t43gozvz ~]# docker commit -a nangubeishang -m "commit apache tomcat" 39717d2ae1ec tomcat8
sha256:b0eb3a5e4dd15e27842783e4a3811b20ddf7dfb7de8758f81813ff994897233e
[root@izbp13a472vhas8t43gozvz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat8 latest b0eb3a5e4dd1 6 seconds ago 652 MB
容器数据卷
容器数据卷分为容器内的数据在主机上的位置
和自己手动绑定的数据卷
docker run -it -v 主机目录:容器内目录 -p 本机端口:容器端口 --name 容器名字 镜像
docker volume 可选参数
可选参数:
ls
inspect
1.查看所有的volumn(容器数据卷)的情况docker volume ls
[root@izbp13a472vhas8t43gozvz ~]# docker volume ls
DRIVER VOLUME NAME
local 3b0e1debe6e3013eb136c7b88c61ab279859f5cefe00a14a17f3a07219fbca5e
local 3c5451d6b2fa586655c0bd162af79157a91fa2669d9e8e7bcaff279cecce592b
local e97af0fc4e03fc1645bfb0a2e4711e4d57b525bc8dfaca270b3d3f0da5901f10
local f68ada1917e6937a2a2ad10c2dd8ef7fc478f4c91ad2e6689fb35749f8bcf440
2.使用docker volume inspect 容器卷名字
看到的是容器数据卷在主机上的位置
[root@izbp13a472vhas8t43gozvz ~]# docker volume inspect f68ada1917e6937a2a2ad10c2dd8ef7fc478f4c91ad2e6689fb35749f8bcf440
[
{
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/f68ada1917e6937a2a2ad10c2dd8ef7fc478f4c91ad2e6689fb35749f8bcf440/_data",
"Name": "f68ada1917e6937a2a2ad10c2dd8ef7fc478f4c91ad2e6689fb35749f8bcf440",
"Options": {},
"Scope": "local"
}
]
匿名挂载
使用 -v /var/data:/webapps
docker run -it --name mytomcat -P -v /webapps tomcat
具名挂载
-v tomcatvolume:/webapps tomcat
docker run -it --name mytomcat -P -v tomcatvolume:/webapps tomcat
指定路径挂载
-v 主机路径:容器路径
docker run -it --name mytomcat -P -v /var/data:/webapps tomcat
补充
1.通过
-v
容器内路径,ro,rw
改变读写权限
ro
readonly 只读 容器中的文件只读
rw
readwrite 读写一旦设置了容器权限,容器对我们挂载出来的内容就有了限定
docker run -it --name mytomcat -P -v /var/data:/webapps:ro tomcat
2.使用
--volumes-from 容器
可以达到多个容器的数据共享 数据只有一份,但是删除一个容器数据不会被删除docker run -itd -P --volumes-from data_container --name myhttp1 httpd
DockerFile
Dockerfile命令脚本
1.编写dockerfile
FROM centos
VOLUME ["/TEST"] #容器数据卷挂载
CMD echo "====mycentos sucess!!!!!!===" #容器启动时会输出的信息
2.使用docker build
构建镜像
[root@izbp13a472vhas8t43gozvz ~]# docker build -f dockerfile -t mycentos:1.0 .
Sending build context to Docker daemon 30.92 MB
Step 1/3 : FROM centos
---> 470671670cac
Step 2/3 : VOLUME /TEST
---> Running in 29959e5fb3e0
---> 806829cd5f18
Removing intermediate container 29959e5fb3e0
Step 3/3 : CMD echo "====mycentos sucess!!!!!!==="
---> Running in 014f51597017
---> a86148237ccf
Removing intermediate container 014f51597017
Successfully built a86148237ccf
启动容器进行测试
[root@izbp13a472vhas8t43gozvz ~]# docker run -it --name centos1.0 mycentos:1.0
====mycentos sucess!!!!!!===
可以看到使用了
CMD
命令在容器启动是会操作
命令
FROM
格式为 FROM <image>
或 FROM <image>:<tag>
。
Dockerfile 的第一条指令必须为 FROM 指令。并且,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令。
# 第一行必须指定基础容器,这里的是tomcat8
FROM tomcat:8
MAINTAINER
格式为 MAINTAINER ,指定维护者信息。
注意:MAINTAINER 指令已经被抛弃,建议使用 LABEL 指令。
# 维护者信息(可选)建议用LABEL 指令
MAINTAINER xiaojianjun xiaojianjun@tansun.com.cn
LABEL
LABEL 指令为镜像添加标签。一个 LABEL 就是一个键值对,也可以一行指定多个键值对。
#多行指定信息
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \that label-values can span multiple lines."
#一行指定多个键值对
LABEL app.version="1.0" app.host='bestxiao.cn' description="这个app产品构建"
如果新添加的 LABEL 和已有的 LABEL 同名,则新值会覆盖掉旧值。
CMD
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条 CMD 命令,只有最后一条会被执行。如果用户在启动容器时指定了要运行的命令,则会覆盖掉 CMD 指定的命令。
CMD echo "------success------OK------"
EXPOSE
告诉 Docker 服务,容器需要暴露的端口号,供互联系统使用。在启动容器时需要通过 -P 参数让 Docker 主机分配一个端口转发到指定的端口。使用 -p 参数则可以具体指定主机上哪个端口映射过来。
EXPOSE 22 80 8443 8080
ENV
格式为 ENV <key> <value>
。指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
RUN
每条 RUN 指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。
RUN yum -y install java-1.8.0-openjdk
ADD
该命令将复制指定的 到容器中的 。其中 可以是 Dockerfile 所在目录的一个相对路径(文件或目录);也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
ADD <src> <dest>
COPY
复制本地主机的 (为 Dockerfile 所在目录的相对路径,文件或目录) 为容器中的 。目标路径不存在时,会自动创建。当使用本地目录为源目录时,推荐使用 COPY。
COPY <src> <dest>
ADD/COPY 将外部文件copy到容器中。区别是ADD可以使用URL,还可以是tar
COPY只能使用dockerfile所在目录
ENTRYPOINT
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个 ENTRYPOINT 时,只有最后一个生效。
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2 (shell 中执行)
VOLUME
使用 VOLUME 指令添加多个数据卷,创建一个可以从本地或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
VOLUME ["/data"]
VOLUME ["/data1", "/data2"]
docker网络
查看容器内部网络
docker exec -it gogs ip addr
[root@izbp13a472vhas8t43gozvz ~]# docker exec -it gogs ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
88: eth0@if89: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:4/64 scope link
valid_lft forever preferred_lft forever
#linux可以ping通容器内部
[root@izbp13a472vhas8t43gozvz ~]# ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.206 ms
–link实现容器网络互联
#使tomacat2的hosts文件中有tomacat1
[root@izbp13a472vhas8t43gozvz ~]# docker run -itd --name tomacat2 --link tomacat1 -P tomcat8
f848a3f3250ec7489b69e7bf063af65bc94feabaf469f64b955886fa0cd8c10d
[root@izbp13a472vhas8t43gozvz ~]# docker exec -it tomacat2 ping tomacat1
PING tomacat1 (172.17.0.6) 56(84) bytes of data.
64 bytes from tomacat1 (172.17.0.6): icmp_seq=1 ttl=64 time=0.296 ms
64 bytes from tomacat1 (172.17.0.6): icmp_seq=2 ttl=64 time=0.092 ms
#使用--link的实质是在hosts加上了DNS
[root@izbp13a472vhas8t43gozvz ~]# docker exec -it tomacat2 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.6 tomacat1 36e8c0c01ab0
172.17.0.7 f848a3f3250e
使用的是docker0特点:默认,需要使用--link
才能在DNS中添加映射
自定义网络
**docker network ls
**查看docker所有网络
网络模式:
bridge:该网络支持在同一个宿主机上的各个容器实例之间的通信。bridge网络是一个独立的网络空间,在网络空间内部的各个容器实例能够直接通信。各个容器实例都是连接到一个网桥,即docker0。docker0通过iptables维护了一个NAT路由表,能够连接bridge网络与宿主机的网卡。外部请求到达宿主机的网卡后,根据“宿主机IP:宿主机端口”与“容器实例IP:容器实例端口”之间的映射关系,进行NAT转发,从而实现外部请求与容器实例之间的通信。
host:加入到该网络中的所有容器实例,容器实例与容器宿主机之间没有网络隔离,所以容器实例都直接使用宿主机的网络,拥有与宿主机一样的IP,使用的是宿主机的端口。即所有容器实例的使用网卡都是宿主机的网卡,所有容器实例的IP都是宿主机的IP。一个宿主机上的所有容器实例,默认都是相通的,彼此之间通过localhost即可互相访问。不同的容器实例使用的网络端口(其实就是宿主机的端口)必须不同,否则会因冲突而无法启动容器实例。
none:none网络是Docker Engine启动即默认创建的网络之一。none网络的网络驱动器为none,即-d=none。
none网络是一个完全隔离的自治网络,甚至与Docker宿主机的网络都不通,必须手工配置网卡后才能够使用。
加入到该网络的容器实例,往往要在后续设置中加入到其他的第三方网络。
创建网络 bridge docker network create --driver bridge --gateway 192.168.0.1 --subnet 192.168.0.0/16 mynet
docker network create --driver bridge --gateway 192.168.0.1 --subnet 192.168.0.0/16 mynet
查看网络详细信息docker network inspect mynet
[root@izbp13a472vhas8t43gozvz ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "7837892c4c1d74c78076e5a24f1fed51d17f8ac41ced4666452c4db8901b4ad0",
"Created": "2020-05-29T12:19:07.830615171+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
使用自己的网络创建容器 加上--net 网络名
参数就可以
[root@izbp13a472vhas8t43gozvz ~]# docker run --name tomcat1 --net mynet -P -itd tomcat8
9cd186513900a8722a1dcecf0cea734b3a3c489b307e3c710f249aa22878ef1b
[root@izbp13a472vhas8t43gozvz ~]# docker run --name tomcat2 --net mynet -P -itd tomcat8
d319524803a2f21e289001a6fff3886aecf8b561e3b6694f93a59f2e3f847c57
可以在Containers中看到我们有哪些容器使用了这个网络
[root@izbp13a472vhas8t43gozvz ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "7837892c4c1d74c78076e5a24f1fed51d17f8ac41ced4666452c4db8901b4ad0",
"Created": "2020-05-29T12:19:07.830615171+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {
"9cd186513900a8722a1dcecf0cea734b3a3c489b307e3c710f249aa22878ef1b": {
"Name": "tomcat1",
"EndpointID": "52db2338442b1bfedb8841d4b03c980540c9a59429797d45d7c96f107a2f1951",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"d319524803a2f21e289001a6fff3886aecf8b561e3b6694f93a59f2e3f847c57": {
"Name": "tomcat2",
"EndpointID": "673435b6c505030d644c9f5368fedb8192ca52cef2d4d17eacfa70fe4750ab43",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@izbp13a472vhas8t43gozvz ~]# docker exec -it tomcat2 ping tomcat1
PING tomcat1 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat1.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.159 ms
64 bytes from tomcat1.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.098 ms
可以发现不用在手动加上DNS映射,他自己会帮我们维护
docker-compose
一个项目的完整环境包括应用节点(app) 、数据库(mySql)、 缓存(Redis)。 为了管理方便,是否可以将这些节点
全部构建在一个容器中运行?答案是可以的, 但并不推荐这么做,因为它违背了Docker中运行环境隔离的设计初衷。
(每个节点都有其运行环境,如果合在一起,自然它们的环境也要搓合在一起)。
那么怎么简化多节点项目环境的维护呢? Docker-compose就可以解决该问题。通过DockerCompose.yml 描述项目中
各节点容器信息,及依赖信息。然后通过docer-compose一键构建或启动。
安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 给docker-compose添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
卸载
sudo rm /usr/local/bin/docker-compose
查看版本
docker-compose --version
docker-compose.yml
示例文件
version: "3.3" #docker-compose yml版本 #具体的版本号,请参考官网https://docs.docker.com/compose/compose-file/
services: #代表一个项目
nginx: #应用 容器
image: nginx #镜像
ports: #端口映射
- "80:80"
link: #
- app
volumes:
- "./nginx.config.d/:/etc/nginx/config.d"
app: #应用
image: luban/app
cd /opt
mkdir docker-es
cd docker-es
vim docker-compose.yml
docker-compose up -d
version: "3.3"
services: #代表一个项目
elasticsearch:
image: daocloud.io/library/elasticsearch:6.5.4
restart: always
container_name: elasticsearch
ports:
- 9200:9200
kibana:
image: daocloud.io/library/kibana:6.5.4
restart: always
container_name: kibana
ports:
- 5601:5601
environment:
- elasticsearch_url=http://192.168.32.130:9200
depends_on:
- elasticsearch
常用命令
docker images -qa
docker pull 镜像
docker rmi $(docker images -qa)
docker run --name 容器名 -it 镜像名称或者镜像ID
docker ps
docker ps -a
常用软件安装
mysql
docker run -p 3306:3306 --name mysql8 \
-e MYSQL_ROOT_PASSWORD=123456 \
-itd mysql
docker exec -it mysql8 bash
mysql -uroot -p123456
Linux附录
1.mkdir {1…100} #可以创建100个文件夹,以数字命名 同理mkdir {a…z}可以创建a到z的文件夹
[root@izbp13a472vhas8t43gozvz test]# mkdir {1..100}
[root@izbp13a472vhas8t43gozvz test]# ls
1 11 14 17 2 22 25 28 30 33 36 39 41 44 47 5 52 55 58 60 63 66 69 71 74 77 8 82 85 88 90 93 96 99
10 12 15 18 20 23 26 29 31 34 37 4 42 45 48 50 53 56 59 61 64 67 7 72 75 78 80 83 86 89 91 94 97
100 13 16 19 21 24 27 3 32 35 38 40 43 46 49 51 54 57 6 62 65 68 70 73 76 79 81 84 87 9 92 95 98
2.xargs管道命令
xargs 中的 -i 参数表示将 xargs 的每项名称一项一项赋值给 {}.
ls | xargs -i touch {}/1.txt #每个目录下会创建一个1.txt文件,就像for循环一样
#会吧前面所有结果放到 命令的最后一次执行。
docker ps -aq | xargs docker rm -f #删除所有容器
_ROOT_PASSWORD=123456
-itd mysql
```shell
docker exec -it mysql8 bash
mysql -uroot -p123456
Linux附录
1.mkdir {1…100} #可以创建100个文件夹,以数字命名 同理mkdir {a…z}可以创建a到z的文件夹
[root@izbp13a472vhas8t43gozvz test]# mkdir {1..100}
[root@izbp13a472vhas8t43gozvz test]# ls
1 11 14 17 2 22 25 28 30 33 36 39 41 44 47 5 52 55 58 60 63 66 69 71 74 77 8 82 85 88 90 93 96 99
10 12 15 18 20 23 26 29 31 34 37 4 42 45 48 50 53 56 59 61 64 67 7 72 75 78 80 83 86 89 91 94 97
100 13 16 19 21 24 27 3 32 35 38 40 43 46 49 51 54 57 6 62 65 68 70 73 76 79 81 84 87 9 92 95 98
2.xargs管道命令
xargs 中的 -i 参数表示将 xargs 的每项名称一项一项赋值给 {}.
ls | xargs -i touch {}/1.txt #每个目录下会创建一个1.txt文件,就像for循环一样
#会吧前面所有结果放到 命令的最后一次执行。
docker ps -aq | xargs docker rm -f #删除所有容器