docker笔记

141 阅读9分钟

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镜像 流程

image.png

image.png




docker为什么比vm快

1.docker有着比虚拟机更少的抽象层 2.docker利用的是宿主机的内核,vm需要是Guest OS

image.png

新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核




镜像命令

docker image 查看所有本地的主机上的镜像

image.png

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

image.png



查看运行容器

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了
优点:相比创建死循环 代码不会太冗余

image.png


查看容器中进程信息

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

image.png




命令小结

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 #本机自测

image.png


端口暴露概念:

image.png

image.png

部署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
 

image.png

commit

docker commit 提交容器成为一个新的副本
#命令和git原理类似
docker commit -a="作者" -m="提交的描述信息"  容器id 目标镜像名:[TAG]
例:docker commit -a="damon" -m="add webapps" fc94f7ec284b tomcat01:1.0

数据卷

容器之间有一个数据共享的技术 docker容器中产生的数据 同步到本地--卷技术

image.png

方式一:直接使用命令来挂载 -v

docker run -dit -v 主机目录:容器内目录 #指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
ro readonly #只读
rw readwrite #可读可写

image.png

可以看到home目录下多了一个test

image.png

docker inspect 容器id

"Mounts": [      #挂载 -v卷
            {
                "Type": "bind", 
                "Source": "/home/test", #主机内地址
                "Destination": "/home", #docker容器内地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }


实现数据同步:即使停止容器 在宿主机上修改文件 再启动容器 数据依旧同步

image.png

image.png




方式二: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文件

image.png

退出容器之后可以用docker inspect 容器id
再找到Mounts 可以看到与容器相挂载的本地文件目录

image.png

进入在本地相同步的volume01的目录 可以看到有一个test.txt

image.png

安装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

image.png

连接成功

image.png

在sqlyog中创建一个新的数据库test

image.png

数据卷成功把容器数据映射到云服务器本地

image.png




数据卷容器

image.png

--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指令

image.png

编写一个自己的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的命令现在也有了

image.png



docker网络

我们每启动一个docker容器 docker就会给容器分配一个ip 只要安装了docker 就会有一个网卡docker0桥接模式 使用的是evth-pair技术

docker容器之间都可以ping通 docker使用的是linux桥接

--link就是在hosts配置文件中增加了另一个容器ip的配置 一般不使用link

自定义网络

bridge: 桥接 docker
none: 不配置网络
host:和宿主机共享网络

image.png

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   #网关

image.png

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

image.png

不同网络容器连接

image.png

#首先在docker网络下创建tomcat01 tomcat02
#将docker网络的tomcat01连接到自定义网络mynet
docker network connect mynet tomcat01

联通之后发现就是将tomcat01放到了mynet网络

image.png

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:

image.png

10.最后再次访问 ip:8848/nacos 即可 持久化成功

image.png

11.启动失败或者网页访问不了 最好查看日志 看看情况

docker container logs nacos

12.网页访问不了 记得查看防火墙以及安全组是否打开 重设防火墙 需重启docker

systemctl restart docker