Docker学习完结

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker学习完结相关的知识,希望对你有一定的参考价值。

Docker学习完结

镜像加速

/etc/docker/daemon.json (若没有该文件则mkdir自行创建)

加入下面代码,然后保存。

"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com/","https://5j6vk9v8.mirror.aliyuncs.com"]

上面三个镜像分别是中科大、网易、阿里云的镜像。其中阿里云的镜像需要阿里云账户自行设置。

加入完上面的代码后,执行下面指令。

sudo systemctl daemon-reload  #重启配置文件
sudo systemctl restart docker #重启docker
docker info #查看是否配置成功

有上图,说明配置成功。

1.阿里云配置镜像加速

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

相关指令

1.查看镜像

docker iamges

REPOSITORY 镜像名

TAG 版本(标签)

IMAGE ID 镜像ID

CREATED 创建时间

SIZE 大小

2.搜索镜像

docker search images

INDEX 索引

NAME 镜像名

DESCRIPTION 描述

STARS 用户标星数

OFFICAL 是否为官方镜像

AUTOMATED 是否为自制镜像

3.拉取镜像

docker pull redis #以redis为例,不加标签默认拉取latest
docker pull redis:5 #拉去redis的5版本

可以看到TAG是不同的

4.删除镜像

docker rmi redis #以redis为例,不加TAG默认删除latest
docker rmi redis:5 #删除redis:5 
docker rmi IMAGEID  #通过镜像ID也可以删除

5.创建并运行容器

这里以nginx为例

docker run --name mynginx -P nginx 

–name 给容器起名

-P 随机映射端口 也可以指定端口映射:-p 80:80

这里是创建容器并进入。

启动后因为占用了控制台,再开一个会话,查看当前运行的容器。

可以发现,容器已经启动了。

CONTAINER ID 容器ID

IMAGE 镜像

COMMAND 启动命令

CREATED 创建时间

STATUS 状态

PORTS 0.0.0.0:49153->80/tcp 宿主机的49153端口映射到容器的80端口。

NAMES 容器名

然后我们可以尝试访问

宿主机IP+端口号

下面是我的

http://47.95.238.105:49153/

如果访问不了可能是防火墙的问题,如果是阿里云服务器等需要开放对应端口。

其他参数

-it 启动容器并进入命令行

-d 后台运行容器

-v 目录映射

docker run -d -p 81:80 --name mynginx nginx 

6.进入容器

当容器以守护方式启动时(即在后台),我们需要进入容器可以下面的命令。

docker exec -it 容器名/ID /bin/bash

/bin/bash 进入到命令行

7.启动和停止容器

docker stop 容器名/ID #停止容器
docker start 容器名/ID #启动容器

注意删除正在运行的容器之前,要先停止该容器。

8.删除容器

docker rm 容器ID 
docker rm 容器名 

9.拷贝文件

宿主机文件拷贝到容器中

docker cp test.txt mynginx:/root  # 把文件拷贝到容器的/root目录下

docker exec -it mynginx /bin/bash #进入容器
cat /root/test.txt  #查看是否拷贝成功

容器文件拷贝到宿主机中

touch abc.txt #在容器中创建一个文件
exit #先退出容器
docker cp mynginx:/root/abc.txt /root #拷贝
cd /root #进入目录查看
ls

容器挂载

1.指定目录挂载

docker run --name nginx01 -di -p 81:80 -v /root/docker_test/:/abc/123  nginx

注意-v 操作不能放在结尾,不然会出现容器启动后自动关闭,具体原因待学习。

我们开启两个会话,分别查看一下双向绑定。

(a) 在宿主机下创建一个abc.txt文件


(b) 在容器内创建一个文件


同时修改文件也是双向绑定的。

当停止并删除容器后,容器内的文件删除后,本地挂载的文件不会被删除。

2.查看容器具体信息

docker inspect 容器名/ID

我们可以在Mounts 这一个属性里找到挂载的相应信息。

3.匿名挂载

docker run --name nginx02 -di -p 81:80 -v /abc/123  nginx #匿名挂载
docker inspect nginx02 #查看挂载的信息

-v 后面的参数就是容器里的对应被挂载的路径。

我们可以知道容器对应的路径被挂载到了/var/lib/docker/volumes/一个ID/_data


4.具名挂载

docker run --name nginx04 -di -P -v my_docker_data:/abc/123  nginx #具名挂载

-v 冒号左边是挂载到宿主机后的文件夹名字,右边是被挂载路径。

本质上还是匿名挂载,只不过是自定义命名。所以宿主机上的路径还是

/var/lib/docker/volumes/ID/_data ,不过这里的ID变成了自定义的名字。


5.数据卷设置为只读或者读写

docker run --name nginx01 -di -P -v /root/docker_test/:/abc/123:ro  nginx

-v 最后一个冒号后面的ro 就是read only 只读。

设置为只读后,再创建文件会提示该系统为RO文件系统。

docker run --name nginx01 -di -P -v /root/docker_test/:/abc/123:rw  nginx

设置为rw: read write 读写模式。

6.继承目录卷

docker run --name nginx02 -di -P --volumes-from nginx01:ro  nginx

nginx02以只读模式继承nginx01


7.查看文件挂载信息

docker volume inspect 文件夹名

8.查看容器IP

docker inspect 容器名/ID  

然后找到Networks这个属性

构建镜像

docker commit -a="herio" -m="some message" 容器名 镜像名:版本

-a 表示作者

-m 表示提交信息

容器名是当前将容器转换为镜像的容器

镜像名:版本 表示提交的镜像叫什么名字,版本是多少。


DockerFile

https://harris.blog.csdn.net/article/details/115333364 曾经写过的一篇



镜像备份

docker save -o /root/mynginx.tar nginx:latest #-o 表示写入的文件路径

我们先删除原来的nginx镜像

docker load -i /root/mynginx.tar #镜像恢复

此时我们镜像已经恢复成功!!


Docker注册及登录和推送镜像

docker login # 然后输入用户名和密码即可

密码会储存在/root/.docker/config.json

不过是加密的。

推送镜像

下面的用户名改成自己的

docker tag hello-world:latest herio123/my-hello-world:1.0.0
docker push herio123/my-hello-world:1.0.0

然后上dockerhub 查看,若不存在说明账户还没邮箱认证。

拉取镜像

docker pull herio123/my-hello-world:1.0.0

测试

退出

docker logout

搭建私有仓库

1.拉取镜像

docker pull registery

2.配置私有仓库地址

vi /etc/docker/daemon.json

# 添加下面的配置,ip填自己主机的
"insecure-registries": ["47.95.238.105:5000"]

注意如果配置文件里有多项,要加逗号分隔,不然无法启动。

3.重新加载配置并重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

4.创建容器

docker run -di -p 5000:5000 --name registry -v /root/docker_registry:/var/lib/registry registry

5.测试

# 访问下面的地址
http://47.95.238.105:5000/v2/_catalog

将镜像推送到私有仓库

# 标记hello-world该镜像需要推送到私有仓库
docker tag hello-world:latest 47.95.238.105:5000/hello-world:1.0.0

# 通过push指令推送到私有仓库
docker push 47.95.238.105:5000/hello-world:1.0.0

因为我们本地做了挂载,所以可以查看

/root/docker_registry/docker/registry/v2/repositories/hello-world

私有仓库认证功能实现

openssl req -newkey rsa:2048 -nodes -sha256 -keyout /root/docker_registry/certs/domain.key -x509 -days 365 -out /root/docker_registry/certs/domain.crt

生成鉴权密码文件

mkdir -p /root/docker_registry/auth
yum --disableexcludes=all install -y httpd
htpasswd -Bbn root 1234 > /root/docker_registry/auth/htpasswd

创建私有仓库容器

docker run -di -p 5000:5000 --name registry \\
   -v /root/docker_registry:/var/lib/registry \\
   -v /root/docker_identify/certs:/certs \\
   -v /root/docker_identify/auth:/auth \\
   -e "REGISTRY_AUTH=htpasswd" \\
   -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \\
   -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \\
   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \\
   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \\
   registry
   
   
   

直接上传会发现需要认证

docker tag hello-world:latest 47.95.238.105:5000/test-hello-world:1.0.0
docker push 47.95.238.105:5000/test-hello-world:1.0.0

我们先进行登录

docker login ip:5000 #ip+端口号,然后输入用户名,密码

登录成功之后,就可以进行push了

docker push 47.95.238.105:5000/test-hello-world:1.0.0

移除登录信息

docker logout 47.95.238.105:5000

相关问题解决

容器运行报错

原因

安装docker时可能存在某些问题

解决方法

sudo yum update #使用 root 权限登录 Centos。确保 yum 包更新到最新
sudo yum remove docker  docker-common docker-selinux dockesr-engine #卸载旧版本
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 #安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #设置yum源,这里使用阿里云下载更快
sudo yum install docker-ce #安装docker
systemctl start docker #启动docker
systemctl enable docker #设置为开机自启动
docker version #查看是否安装成功

Bridge桥接网络模式

启动一个容器后,docker会给这个容器分配一个虚拟网卡

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6hCREG1P-1628000538502)(C:\\Users\\HeHao\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210801222553697.png)]

容器的虚拟网卡和docker0 会有个eth0-veth pair对


Host主机网络模式

None网络模式

只有一个本地localhost 网络。


Container网络模式

启动一个容器时加上--network container:容器名|ID


自定义网络

docker network create custom_network #自定义名为custom_network的网络
docker network ls #查看
docker run -it --name bbox01 --net custom_network busybox #启动容器
docker run -it --name bbox02 --net custom_network busybox
docker inspect bbox01  #查看容器IP 172.18.0.3
docker inspect bbox01  #172.18.0.3
ping bbox02 #01容器下ping 02
ping bbox01 #02容器下ping 01


默认bridge 不能通过容器名通信,而自定义网络可以。

学习视频

传送门

以上是关于Docker学习完结的主要内容,如果未能解决你的问题,请参考以下文章

Vue 开发实战学习笔记48篇(完结)

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第十步---发射子弹&怪物受伤---全部源代码和资源完结下载

图解 Google V8学习笔记合集 23 篇(完结)

Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段

pikachu靶场(完结)

TypeScript教程学习笔记(未完结)