docker配置镜像加速
在阿里云的容器镜像服务中查看 每个人的都不一样
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
拉取hello-world镜像 流程
docker为什么比vm快
1.docker有着比虚拟机更少的抽象层 2.docker利用的是宿主机的内核,vm需要是Guest OS
新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核
镜像命令
docker image 查看所有本地的主机上的镜像
REPOSITORY 镜像仓库源
TAG镜像的标签
IMAGE ID 镜像的id
SIZE 镜像的大小
-a 列出所有镜像 --help 获取帮助
docker search 搜索镜像 docker pull 下载镜像 不写tag默认获取最新版
docker rmi -f 镜像id 删除镜像
docker rmi -f $(docker images -aq) 删除全部的镜像
容器命令
说明:有了镜像才能创建容器 下载一个centos镜像
docker pull centos
启动并进入容器 并查看
docker run [可选参数] image
#参数说明
--name="Name" 容器名字 如tomcat01 tomcat02 用来区分容器
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器端口
-P(大写) #随机指定端口
docker run -it centos /bin/bash
查看运行容器
docker ps 命令 #列出当前正在运行的容器
-a #列出当前正在运行的容器+历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
退出和删除容器
#退出
exit #直接容器停止并退出
Ctrl+p+q #退出容器不停止
#删除
docker rm 容器id #删除指定容器,不能删除正在运行的 -f可以强制删除
docker rm -f $(docker ps -aq) #删除所有容器
启动和停止容器的操作
docker start +容器id
docker restart +容器id
docker stop +容器id
docker kill +容器id
常用其他命令
后台启动容器
#docker run -d 镜像名
[root@iz0jlfdhubp6djwetgkufkz ~]# docker run -d centos
#问题docker ps 发现 centos停止了
#常见的坑,docker容器使用后台运行,就必须有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立刻停止
#解决方案
docker run -dit centos /bin/bash
添加-it 参数交互运行
添加-d 参数后台运行
这样就能启动一个一直停留在后台运行的Centos了
优点:相比创建死循环 代码不会太冗余
查看容器中进程信息
docker top 容器id
查看镜像的元数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it 容器id /bin/bash #进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach 容器id #进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机
touch test.java #在容器新建一个文件
docker cp 容器id:/目录/目标文件 /当前文件
docker cp 6c28866b0bb4:/home/test.txt /home
命令小结
attach Attach to a running container #当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile定制镜像
commit Create a new image from a container's changes #提交当前容器为新的镜像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container #创建一个新的容器,同run 但不启动容器
diff Inspect changes on a container's filesystem #查看docker容器变化
events Get real time events from the server #从docker服务获取容器实时事件
exec Run a command in a running container #在已存在的容器上运行命令
export Export a container's filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)
history Show the history of an image #展示一个镜像形成历史
rename Rename a container #重命名容器
restart Restart a running container #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image(s) to a tar archive #保存一个镜像为一个tar包(对应load)
search Search the Docker Hub for images #在docker
hub中搜索镜像
start Start one or more stopped containers #启动容器
stats Display a live stream of container(s) resource usage statistics #统计容器使用资源
stop Stop a running container #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Display the running processes of a container #查看容器中运行的进程信息
unpause Unpause all processes within a container #取消暂停容器
version Show the Docker version information#查看容器版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
部署nginx
docker search nginx #搜索nginx
docker pull nginx #拉取镜像
docker run -d --name nginx01 -p 443:80 nginx #容器80端口映射到外面的宿主机443端口
curl localhost:443 #本机自测
端口暴露概念:
部署tomcat
docker pull tomcat:9.0 #拉取指定版本镜像
docker run -d -p 1521:8080 --name tomcat01 tomcat:9.0 #启动tomcat 注意端口映射
docker exec -it tomcat01 /bin/bash //进入容器
部署portainer
docker pull portainer/portainer
docker run -p 9000:9000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mydata/portainer/data:/data \
-d portainer/portainer
#最后访问ip:9000
commit
docker commit 提交容器成为一个新的副本
#命令和git原理类似
docker commit -a="作者" -m="提交的描述信息" 容器id 目标镜像名:[TAG]
例:docker commit -a="damon" -m="add webapps" fc94f7ec284b tomcat01:1.0
数据卷
容器之间有一个数据共享的技术 docker容器中产生的数据 同步到本地--卷技术
方式一:直接使用命令来挂载 -v
docker run -dit -v 主机目录:容器内目录 #指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
ro readonly #只读
rw readwrite #可读可写
可以看到home目录下多了一个test
docker inspect 容器id
"Mounts": [ #挂载 -v卷
{
"Type": "bind",
"Source": "/home/test", #主机内地址
"Destination": "/home", #docker容器内地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
实现数据同步:即使停止容器 在宿主机上修改文件 再启动容器 数据依旧同步
方式二:Dockerflie
dockerfile是用来构建docker镜像的构建文件
通过这个脚本可以生成镜像 直接挂载
FROM centos
VOLUME ["volume01","volume02"] #匿名挂载
CMD echo "----end----"
CMD /bin/bash
生成容器
docker build -f /home/docker-test-volume/dockerfile01 -t damon/centos:4.0 . # .表示在当前目录下 不写版本默认找最新
启动容器
ls -l 可以看到volume01和volume02 就是在我们生成镜像的时候自动挂载的数据卷目录,然后进入volume01中创建一个test.txt文件
退出容器之后可以用docker inspect 容器id
再找到Mounts 可以看到与容器相挂载的本地文件目录
进入在本地相同步的volume01的目录 可以看到有一个test.txt
安装mysql
#-p:端口映射
#-v:卷挂载
#-e:环境配置 配置mysql的密码
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=*** --name mysql01 mysql:5.7
通过sqlyog连接mysql
连接成功
在sqlyog中创建一个新的数据库test
数据卷成功把容器数据映射到云服务器本地
数据卷容器
--volumes-from
docker run -it --name damoncentos01 damon/centos:4.0
docker run -it --name damoncentos02 --volumes-from damoncentos01 damon/centos:4.0
#02挂载了01 02可以同步到01的数据 再创建03也能同步到01的数据 01也能同步02 03的数据 从而实现了数据共享
#即使删除容器01之后 02,03里面的数据也不会消失
多个mysql实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=*** --name mysql01 mysql:5.7
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=*** --name mysql02 --volumes-from mysql01 mysql:5.7
数据卷的生命周期:
一直持续到没有容器使用为止
DockerFile指令
编写一个自己的centos
FROM centos
MAINTAINER DamonTsang<damontsang@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 39439
CMD echo $MYPATH
CMD echo "--end--"
CMD /bin/bash
docker build -f dockercentos -t mycentos:0.1 .
启动并进入容器以后发现 原来基础镜像没有vim的命令现在也有了
docker网络
我们每启动一个docker容器 docker就会给容器分配一个ip 只要安装了docker 就会有一个网卡docker0桥接模式 使用的是evth-pair技术
docker容器之间都可以ping通 docker使用的是linux桥接
--link就是在hosts配置文件中增加了另一个容器ip的配置 一般不使用link
自定义网络
bridge: 桥接 docker
none: 不配置网络
host:和宿主机共享网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
--driver bridge #桥接
--subnet 192.168.0.0/16 #子网
--gateway 192.168.0.1 #网关
docker run -d -P --name tomcat-net-01 --net mynet tomcat
#创建一个tomcat容器到刚刚自己创建的网络
docker network inspect mynet
#发现两个tomcat已经到自定义网络了
docker exec -it tomcat-net-01 ping tomcat-net-02
#测试ping
不同网络容器连接
#首先在docker网络下创建tomcat01 tomcat02
#将docker网络的tomcat01连接到自定义网络mynet
docker network connect mynet tomcat01
联通之后发现就是将tomcat01放到了mynet网络
docker配置nacos 以及持久化
1.拉取一个指定nacos版本的镜像 并启动 测试能否访问 ip:8848/nacos 此为单机版并且没有持久化
docker pull nacos/nacos-server:1.1.4
docker run -p 8848:8848 -e MODE=standalone --name nacos -d nacos/nacos-server:1.1.4
2.拉取一个指定mysql版本的镜像
docker pull mysql:5.7.26
3.启动mysql镜像 注意改成自己刚刚拉取镜像的版本号
sudo docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.26
4.进入mysql容器
docekr exec -it mysql bash
5.直接登录mysql并成功
docker exec -it mysql mysql -uroot -proot
6.创建一个数据库名称为 nacos_config
creat database nacos_config;
7.导入nacos的sql脚本 这里笔者采用最简单的方式 sqlyog直接导入
8.进入nacos容器并修改application.properties
docker exec -it nacos容器id bash
#进入容器 在config文件中找到application.properties文件 并增加下面字段
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysqlIP:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
#注意这里需改成刚刚mysql容器的内网ip 以及自己的账号和密码
9.查询ip命令
docker inspect 容器id #IPAddress:
10.最后再次访问 ip:8848/nacos 即可 持久化成功
11.启动失败或者网页访问不了 最好查看日志 看看情况
docker container logs nacos
12.网页访问不了 记得查看防火墙以及安全组是否打开 重设防火墙 需重启docker
systemctl restart docker