赞
踩
目录
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
docker version
docker run hello-world
查看下载的helloworld镜像
docker images
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tibjzfhr.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker version #查看docker版本信息
docker info #查看docker详细信息
docker 命令 --help #万能命令
帮助文档:Docker run reference | Docker Documentation
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 7 weeks ago 13.3kB
#解释:
REPOSITORY 镜像仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 创建的时间
SIZE 镜像的大小
#可选项:
-a, --all #列出所有镜像
-q, --quiet #只显示镜像id
[root@localhost docker]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11686 [OK]
mariadb MariaDB Server is a high performing open sou… 4453 [OK]
#可选项,通过收藏来过滤:
--filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的
[root@localhost docker]# docker search mysql --filter=STARS=5000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11686 [OK]
#下载镜像 docker pull 镜像名[:tag]
[root@localhost docker]# docker pull mysql
Using default tag: latest #如果不写 tag,默认就是latest
latest: Pulling from library/mysql
b380bbd43752: Pull complete #分层下载,docker image的核心 联合文件系统
f23cbf2ecc5d: Pull complete
30cfc6c29c0a: Pull complete
b38609286cbe: Pull complete
8211d9e66cd6: Pull complete
2313f9eeca4a: Pull complete
7eb487d00da0: Pull complete
4d7421c8152e: Pull complete
77f3d8811a28: Pull complete
cce755338cba: Pull complete
69b753046b9f: Pull complete
b2e64b0ab53c: Pull complete
Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#两者等价
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载
docker pull mysql:5.7
docker rmi -f [镜像ID] #删除指定镜像
docker rmi -f [镜像ID] [镜像ID] [镜像ID] #删除多个镜像
docker rmi -f $(docker images -aq) #删除所有的镜像
#说明:有了镜像才可以创建容器,liunx,下载一个centos镜像测试
docker pull centos
docker run [可选参数] image
#参数说明
--name=”Name” #容器名字 tomcat01 tomcat02 ,用来区分容器
-d #后台运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P #随机指定端口
#测试,
[root@localhost docker]# docker run -it centos /bin/bash
[root@3dbda64e7ffc /]# ls # 查看容器内的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@3dbda64e7ffc /]# exit #从容器中退回到主机
#docker ps 命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #列出最近创建的容器
-q #只显示容器的编号
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3dbda64e7ffc centos "/bin/bash" 15 minutes ago Exited (0) 13 minutes ago strange_johnson
73a2a60b0032 feb5d9fea6a5 "/hello" 27 hours ago Exited (0) 27 hours ago suspicious_margulis
exit #容器停止并退出
ctrl + p + q #容器不停止退出
Docker rm 容器id #删除某个容器 不能删除正在运行的容器,若要强制删除 rm -f
Docker rm -f $(docker ps -aq) #删除所有容器
Docker ps -a -q|xargs docker rm #删除所有容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #强行杀死容器
#命令docker run -d 镜像名
[root@localhost docker]# docker run -d centos
#问题docker ps,发现centos 停止了
#常见的坑: docker容器使用后台运行,必须要有一个前台进程,docker发现没有应用,就会自动停止
docker logs
docker logs -tf --tail 10 容器id #查看容器所有日志
-tf #显示日志
--tail number #要显示的日志条数
#命令 docker top 容器id
[root@localhost docker]# docker top b68e9698b874
UID PID PPID C STIME TTY TIME CMD
root 11411 11394 0 23:34 pts/0 00:00:00 /bin/bash
docker inspect 容器id
[root@localhost docker]# docker inspect b68e9698b874
#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
方式一:#命令:docker exec -it 容器id bashShell
[root@localhost docker]# docker exec -it b68e9698b874 /bin/bash
#-it 进行交互模式
方式二:#命令:docker attach 容器id
[root@localhost docker]# docker attach b68e9698b874
#正在执行当前代码
#docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach #进入容器正在执行的终端,不会启动新的进程
从容器中拷贝到主机上
docker cp 容器id:容器内的内容 目的的主机路径
#查看当前主机目录
[root@c198f09f7ace /]# [root@localhost home]# ls
reeve
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c198f09f7ace centos "/bin/bash" 16 seconds ago Up 15 seconds zen_mendeleev
#进入docker容器内部
[root@localhost home]# docker attach c198f09f7ace
[root@c198f09f7ace /]# cd /home
[root@c198f09f7ace home]# ls
在容器内创建test.java
[root@c198f09f7ace home]# touch test.java
[root@c198f09f7ace home]# ls
test.java
[root@c198f09f7ace home]# exit
exit
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c198f09f7ace centos "/bin/bash" 2 minutes ago Exited (0) 36 seconds ago zen_mendeleev
631c58b5f5b4 centos "/bin/bash" 3 minutes ago Exited (127) 2 minutes ago ecstatic_brown
b68e9698b874 centos "/bin/bash" 28 minutes ago Exited (0) 14 minutes ago determined_pasteur
417e2744ccbc centos "/etc/bash" 29 minutes ago Created condescending_swanson
771f60030845 centos "/bin/bash" 41 minutes ago Exited (0) 41 minutes ago friendly_clarke
3dbda64e7ffc centos "/bin/bash" 2 hours ago Exited (0) About an hour ago strange_johnson
73a2a60b0032 feb5d9fea6a5 "/hello" 29 hours ago Exited (0) 29 hours ago suspicious_margulis
# 将文件拷贝出来到主机
[root@localhost home]# docker cp c198f09f7ace:home/test.java /home
[root@localhost home]# ls
reeve test.java
docker search nginx # 搜索nginx相关镜像
docker pull nginx # 下载nginx最新版本
docker images # 查看docker镜像
docker run -d --name nginx01 -p 3344:80 nginx #运行nginx镜像
-d 后台运行 --name 重命名为:nginx01 -p 暴露端口,属主机端口:容器内端口
-- 暴露端口的概念
docker run -it --rm tomcat:9.0
--rm 一般用来测试,用完就删除
下载tomcat:docker pull tomcat:9.0
运行tomcat : docker run -d -p 3355:8080 --name tomcat01 tomcat
#进入3355端口发现404
进入容器:[root@localhost home]# docker exec -it tomcat01 /bin/bash
因为:1、linux命令少了,2、没有webapps 阿里云镜像的问题,默认最小的镜像,所有不必要的都剔除了。
解决方法,将webapps.dist内的所有文件cp到webapps内
root@ae9cb56f31aa:/usr/local/tomcat# cp -r webapps.dist/* webapps
Portainer、Rancher(CI/CD)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Portainer用户账号:admin 密码:admin123
docker commit 提交容器成为一个新的副本
#命令和git原理类似
dockers commit -m=”提交的描述信息” -a=”作者” 容器id 目标镜像名:[tag]
(我的理解:就是将当前的容器打包成一个镜像,并可以方便迭代的镜像!)
模拟一个场景,当前如果把容器删了里面的数据都会删除,也就是数据无法持久化
于是就需要有个容器之间的数据共享的技术!
Docker容器中产生的数据同步到本地,这就是卷技术!
总结:也就是要实现容器的持久化和同步操作!实现容器之间的数据可共享!
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
#测试
[root@localhost /]# docker run -it -v /home/test01:/home centos /bin/bash
#启动后通过docker inspect 容器id
测试文件同步:双向绑定
尽管停止容器,修改主机上的文件内容,再启动容器,容器内的数据依旧是同步的!
好处:以后修改只需要本地修改即可,不用再进容器内部,容器会自动同步。
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有volume的情况
docker volume ls
DRIVER VOLUME NAME
local 01afa927dc72205b87ef302606622dc1683ce921b343f3eefc20e0f18f8e7014
local a778597f40f0f26a4b6769bd3b7fdb1e32a776c4d89e822e6bacbf3b77d8b33b
#这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!
[root@localhost reeve]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
1828785e85662f0f338ae237dc1eebf5cd98c747e3df3809221d002893f1cf93
[root@localhost reeve]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
#所有docker内容器的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的卷,大多数情况在使用具名挂载
如何确定是具名挂载还是匿名挂载还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
#拓展:
#通过 -v 容器内路径:ro rw 改写读写权限
ro readonly #只读
rw readwrite #可读可写
#一旦设置了容器权限,容器对我们的挂载出来的内容就有了限定
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx
#只要看到ro就说明这个路径只能通过宿主机来操作,容器内是无法操作的
# 默认就是rw
dockerfile 就是用了构建docker镜像的构建文件!
通过脚本可以生成镜像,镜像就是一层一层的,脚本是一个一个的命令,每个命令都是一层
#创建一个dockerfile文件,名字可以随机,建议Dockerfile
#文件中的内容 指令(大写) 参数
FROM centos
VOLUME [“volume01”,”volume02”]
CMD echo “----END----”
CMD /bin/bash
#这里每个命令都是镜像的一层
#这个目录就是我们生成镜像的时候自动挂载的,数据卷目录
这个卷和外部一定有个同步的目录
查看卷挂载的路径:
测试刚刚创建的txt文件是否同步出去
[root@localhost ~]# cd /var/lib/docker/volumes/7c444642485fce0500cf713b54af3b379499ddb3c92a5d88da32dae15514bc27/_data
[root@localhost _data]# ls
juantest.txt
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
dockerFile:构建文件,定义一切的步骤,源代码
dockerImages:通过dockerFile构建生成镜像,最终发布和运行的产品,原来是jar war。
docker容器:容器就是镜像运行起来提供服务的
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat的压缩包,添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录位置
EXPOSE #暴露端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令,
ONBUILD #当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令
COPY #类似ADD,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
CMD命令测试!
[root@localhost _data]# vim docker-file-test
FROM centos
CMD [“ls”,”-a”]
#构建镜像
[root@localhost _data]# docker build -f docker-file-test -t cmdtest .
#启动镜像 ls -a 命令生效
[root@localhost _data]# docker run 48774fe6d949
#想追加一个命令,-l ls -al
[root@localhost _data]# docker run 48774fe6d949 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
#cmd的清理下 -l 替换了CMD [“ls”,”-a”] 命令,-l不是命令所以报错
ENTRYPOINT命令测试!
#同样的命令,由CMD改成ENTRYPOINT
[root@localhost _data]# vim docker-ENTRYPOINT-file-test
FROM centos
ENTRYPOINT [“ls”,”-a”]
#构建镜像
[root@localhost _data]# docker build -f docker-ENTRYPOINT-file-test -t entrypoint-test .
[root@localhost _data]# docker run d31ce82bcd09
#追加命令,直接拼接在我们的ENTRYPOINT的后面的
[root@localhost _data]# docker run d31ce82bcd09 -l
total 0
drwxr-xr-x 1 root root 6 Nov 17 06:49 .
FROM centos
MAINTAINER reeve<"mysharp163@163.com">
COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-9.0.55-src.tar.gz /usr/local/
ADD jdk-8u60-linux-x64.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_60
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.55
ENV CATALINE_BASH /usr/local/apache-tomcat-9.0.55
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.55/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.55/bin/logs/catalina.out
docker build -t mytomcat .
docker run -it mytomcat /bin/bash
发布自己镜像
docker push localhost/镜像名称:1.0
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -aq)
三个网络
#问题:docker是如何处理容器网络访问的? ip addr ,发现容器启动时候会得到一个ip地址,docker分配
docker exec -it tomcat01 ip addr
linux能不能ping通容器内部? -- linux能ping通docker容器内部
原理:1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是veth-pair技术
再次测试ip addr
再启动一个docker容器,发现又多了一对网卡
发现:容器带来的网卡,都是一对的,这就是veth-pair技术
#veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连,正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备的
openStac,Docker容器之间的连接,ovs的连接,都是使用veth-pair技术。
容器内部之间也可以互相ping通的!
绘制网络模型图
结论:tomcat01和tomcat02是公用的一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
小结:
Docker 使用的是linux的桥接,宿主机中是一个docker容器的网桥 docker0
docker中的所有网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)
只要容器删除,对应的网桥一对就没了
一种场景,当我们编写一个微服务,database url=ip ,项目不重启,数据库的ip变了,我们希望可以处理这个问题,可以通过名字来进行访问容器?
docker exec -it tomcat02 ping tomcat01
是ping不同的! 那么如何解决呢?
- docker run -d -P --name tomcat03 --link tomcat02 tomcat
- docker exec -it tomcat03 ping toomcat02
但是!tomcat02是ping不通03的!
其实这个tomcat03就是在本地配置了tomcat02的配置
本质探究:--link就是我们在hosts 配置中增加了一个tomcat02的映射
但是不建议使用 --link了,不建议使用docker0
docker0的问题:它不支持容器名连接访问!
网络连通
连通之后就是将tomcat01放到mynet容器下
一个容器两个ip地址
- #测试打通 tomcat01 -- mynet
- docker network connect mynet tomcat01
结论:假设要跨网络操作别人,就需要使用docker network connect 连通
- FROM java:8
- COPY *.jar /app.jar
- CMD ["-----server.port=19317"]
- EXPOSE 19317
- ENTRYPOINT ["java","-jar","/app.jar"]
docker build -t (项目名)
docker run -d -P --name (项目名) (镜像名)
之前我们是DockerFile build run 手动操作单个容器,但是当有几十个上百个微服务的时候,其中有一个没有启动起来就非常麻烦
Docker Compose 来轻松高效的管理容器,定义运行多个容器。
官方介绍:
#定义、运行多个容器
#YAML file 配置文件
#single command 命令有哪些
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
#所有环境都可以使用Compose
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
#三步骤
Using Compose is basically a three-step process:
Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere. # Dockerfile保证我们的项目在任何地方可以运行Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment. # services 什么是服务? #docker-compose.yml这个文件怎么写
Run
docker compose up
and the Docker compose command starts and runs your entire app. You can alternatively rundocker-compose up
using the docker-compose binary. # 启动项目
作用:批量容器编排
Compose是Docker官方的开源项目,但是需要安装
Dockerfile 让程序在任何地方运行。web服务。redis、mysql、nginx。。。多个容器。
- version: "3.9" # optional since v1.27.0
- services:
- web:
- build: .
- ports:
- - "5000:5000"
- volumes:
- - .:/code
- - logvolume01:/var/log
- links:
- - redis
- redis:
- image: redis
- volumes:
- logvolume01: {}
compose:重要概念:
1、服务service ,容器。应用。(web、redis、mysql...)
2、项目project 。一组关联的容器
(Install Docker Compose | Docker Documentation)
- sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
- sudo chmod +x /usr/local/bin/docker-compose
-
- #查看是否安装成功
- docker-compose version
(Get started with Docker Compose | Docker Documentation)
Step 1: Setup,在随意文件夹内创建composetest文件
- mkdir composetest
- cd composetest
并创建app.py,内容为:
- import time
-
- import redis
- from flask import Flask
-
- app = Flask(__name__)
- cache = redis.Redis(host='redis', port=6379)
-
- def get_hit_count():
- retries = 5
- while True:
- try:
- return cache.incr('hits')
- except redis.exceptions.ConnectionError as exc:
- if retries == 0:
- raise exc
- retries -= 1
- time.sleep(0.5)
-
- @app.route('/')
- def hello():
- count = get_hit_count()
- return 'Hello World! I have been seen {} times.\n'.format(count)
创建文件requirements.txt,内容为:
- flask
- redis
Step 2: 创建一个 Dockerfile
创建文件Dockerfile,内容为:
- # syntax=docker/dockerfile:1
- FROM python:3.7-alpine
- WORKDIR /code
- ENV FLASK_APP=app.py
- ENV FLASK_RUN_HOST=0.0.0.0
- RUN apk add --no-cache gcc musl-dev linux-headers
- COPY requirements.txt requirements.txt
- RUN pip install -r requirements.txt
- EXPOSE 5000
- COPY . .
- CMD ["flask", "run"]
Step 3: 在 Compose 文件中定义服务
创建文件docker-compose.yml,内容为:(定义了web,redis)
- version: "3.9"
- services:
- web:
- build: .
- ports:
- - "5000:5000"
- redis:
- image: "redis:alpine"
Step 4:使用 Compose 构建并运行您的应用程序
通过运行启动您的应用程序
docker-compose up
关闭compose:
docker-compose down || ctrl+c
docker-compose.yaml 核心
官方文档:Compose file | Docker Documentation
#三层:版本、服务、其他配置
version '' #版本
service #服务
服务1:web
#服务配置
images
build
network
...
服务2:redis
服务3:redis
...
#其他配置 网络/卷、全局规则
volume:
networks:
comfigs:
Quickstart: Compose and WordPress | Docker Documentation
原:下载程序、安装数据库、配置等系列操作
compose应用,一键启动。
1、下载项目(docker-compose.yaml)
2、如果需要文件Dockerfile
3、文件准备齐全(直接一键启动项目)
前台启动
docker -d
docker-compose up -d
1、编写项目微服务
2、dockerfile构建镜像
3、docker-compose.yaml 编排项目
4、丢到服务器 docker-compose up
假设项目需要重新部署打包:
docker-compose up --build
工程、服务、容器
项目compose:三层
·工程project
·服务
·容器 运行实例
集群的方式部署
待更新..
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。