安装
#安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置仓库为阿里源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
或者
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cp docker-ce.repo /etc/yum.repos.d
#更新源
yum clean all && yum mackecache
#检查版本
yum list docker-ce --showduplicates | sort -r
yum list docker-ce-cli --showduplicates | sort -r
#注意overlay2可能需要升级内核,它需要内核4.0以上支持:
#默认安装
yum install docker-ce docker-ce-cli containerd.io
#指定版本
yum install docker-ce-20.10.9-3.el7 \
docker-ce-cli-20.10.9-3.el7 \
containerd.io
#启动和查看
systemctl start docker
systemctl status docker
docker --version
docker info
卸载
查看是否安装docker
-
docker info
-
rpm -qa | grep docker
卸载 Docker 引擎、CLI 和 Containerd 软件包:
yum remove docker-ce docker-ce-cli containerd.io
#或者使用 rpm -e docker-ce docker-ce-cli containerd.io
#查找出docker的相关文件夹 在根目录下查找
find -name 'docker'
#rm -rf 删除这些文件夹
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
docker命令
docker pull 镜像名 拉取镜像
docker pull 镜像名:tag 拉取指定镜像版本
docker images 查看镜像列表
docker images 镜像名称 单独搜索镜像
docker rmi -f 镜像名/镜像id 删除镜像
docker rmi -f 镜像名/镜像id 镜像名/镜像id 镜像名/镜像id 删除多个镜像
docker rmi -f $(docker images -aq) 删除所有镜像 -a 显示全部 -q只显示id
docker image rm 镜像名/镜像id 强制删除镜像
运行一个容器
docker run -it -d --name 要取的别名 镜像名:tag /bin/bash
-it 与容器进行交互式启动 -d 表示可以后台运行容器(守护式运行)
--name 给要运行的容器起的名字 /bin/bash 交互路径
docker run -it -d --name mysql -p 8888:6379 mysql:5.7 /bin/bash
-p 通过访问宿主机8888 就可以映射到容器的6379端口
docker ps 查看正在运行的容器
docker ps -a 查看正在运行的容器和已经停掉的容器
docker exec -it 容器id/容器别名 /bin/bash 访问容器
exit 退出容器
docker stop 容器名/容器id 停止容器(删除容器前需要停止容器)
docker rm -f 容器名/容器id 删除容器
docker rm -f 容器名/容器id 容器名/容器id 容器名/容器id 删除多个容器
docker rm -f $(docker ps -aq) 删除全部容器
docker inspect 容器id 获取容器的详细信息
docker logs -f 容器id/容器名 实时获取日志
docker logs --tail 10 容器名/容器id 查看最新10行日志
安装私有镜像仓库
1.docker pull registry:2.8.1 版本自己定
2. 运行
docker run -d -p 0.0.0.0:5000:5000 \
--name registry \
-v /data/registry/conf/config.yml:/etc/docker/registry/config.yml:ro \
-v /data/registry/data:/liang/my_registry \
registry:2.8.1
3.参数说明
默认情况仓库创建在容器的 /var/lib/registry 目录中,也就是我们上传到registry的私人服务器仓库的文件存储在 /var/lib/registry目录中,考虑权限,一般自己定义
-d 后台运行
-p 端口映射
-v 添加数据卷 格式 -v /宿主机目录:/容器目录 执行会自动创建文件夹
--privileged=true Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
的解决办法
registry 镜像
4. 进入容器
在进入registry容器的时候的命令参数不能使用/bin/bash
,而要使用:bin/sh
、bash
、sh
三个中的一个。输入命令进入registry容器:
docker exec -it 容器id /bin/sh
可以看到 tmp中有个registry的文件夹
5. 提交容器副本为镜像
docker commit -m="说明" -a=作者" 容器名字 自定义的镜像名字:版本
如下例子:
docker commit -m="ubuntu advanced version" -a="liang" liang-ubuntu16.04 ubuntu-advanced:v1
6.查看镜像私服上有哪些镜像
http://主机ip:映射端口/v2/_catalog
修改镜像为符合私服规范的Tag
docker tag 镜像ID或镜像名:Tag Host:Port/Repository:Tag
上面代码的参数含义如下所示:
(1)镜像ID或镜像名:要上传到私有库Registry的镜像ID或名字;
(2)Tag:要上传的镜像版本号;
(3)Host:本地私有库的映射网址(本文为0.0.0.0);
(4)Post:本地私有库的映射端口(本文为5000);
(5)Repository:Tag:上传到私有库Registry后自定义的镜像名字、版本号。
执行命令
docker tag ubuntu-advanced:v1 0.0.0.0:5000/ubuntu-advanced:v1
设置docker可以http访问
cat /etc/docker/daemon.json
如果没有 daemon.json 就创建
配置 insecure-registries
重启 systemctl restart docker
设置账号密码访问
mkdir -p /data/docker.registry/etc/registry/auth
安装工具
yum -y install httpd-tools
创建账号密码 admin 为用户名 123456 为密码
htpasswd -Bbn admin 123456 > /data/docker.registry/etc/registry/auth/passwd
在/data/docker.registry/etc/registry 中创建 config.yml
保存以下内容
# vi /data/docker.registry/etc/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /liang/my_registry
delete: #配置删除权限,默认安装的Registry不支持删除
enabled: true
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
--------------------end-----------------------
运行以下命令
docker run -d -p 5000:5000 \
--name registry_private \
-v /data/docker.registry/etc/registry/auth:/etc/registry/auth \
-v /data/docker.registry/etc/registry/config.yml:/etc/docker/registry/config.yml \
-v /liang/my_registry/:/tmp/registry \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/etc/registry/auth/passwd" registry:2.8.1
推送前需要登录
push 推送到私服
推送镜像的服务器的docker需要在daemon.json中配置出需要连接的私服的地址:
如下所示:
"insecure-registries":["101.11.11.32:5000"]
其中 101.11.11.32:5000就是需要推送的registry的地址和端口
docker push 符合私服规范的Tag的镜像名称或ID:版本号
docker push 0.0.0.0:5000/ubuntu-advanced:v1
通过 ip:5000/v2/_catalog 查看镜像
查看镜像的版本
ip:5000/v2/镜像名/tags/list
查看镜像的digest
curl --location --request GET 'http://ip:5000/v2/镜像名/manifests/版本' --header 'Accept: application/vnd.docker.distribution.manifest.v2+json'
删除镜像
curl --location --request DELETE 'http://ip:5000/v2/mysql/manifests/sha256:238cf050a7270dd6940602e70f1e5a11eeaf4e02035f445b7f613ff5e0641f7d' -ik
返回202成功
gc垃圾回收
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
# 垃圾回收(容器内执行命令)
docker exec -it <私有库的容器ID或者容器名> sh -c ' registry garbage-collect /etc/docker/registry/config.yml'
或
registry garbage-collect /etc/docker/registry/config.yml
重启registry
如果 v2/_catalog 查看还存在镜像
就到config.yml中看 rootdirectory中配置的目录,
进入容器,进入该目录删除镜像
如果启动registry时候对该目录做映射就在宿主机中进入映射的目录删除镜像
拉取私服的镜像到本地并运行
docker pull Registry的网络映射:Registry的端口映射/私有库中的镜像名字:版本号
问题
1.docker 启动nginx容器后,浏览器访问不到
nginx容器启动起来了,但是容器中的nginx没有启动,需要去/usr/sbin中 ./nginx 启动
启动添加 /bin/bash 会出现容器起来了,容器里的服务没起来,可以去掉/bin/bash
docker安装nginx 并挂载目录
先拉取nginx镜像
docker pull nginx
2、查看是否拉取成功
|
3、使用命令在源主机上新建文件夹
1 |
|
4、启动临时nginx
docker run -d --name nginx_test nginx
5、拷贝需要挂载的文件
docker cp nginx_test:/etc/nginx/conf.d /root/nginx/conf docker cp nginx_test:/etc/nginx/nginx.conf /root/nginx/conf/nginx.conf docker cp nginx_test:/usr/share/nginx/html /root/nginx
6、删除临时nginx
1 |
|
7、创建挂载的nginx
--network host \
|
验证:机器地址出现下图就可以了
修改配置文件后 重启
docker exec nginx nginx -s reload
使用nginx代理registry的服务并配置ssl认证
在nginx的 conf.d中创建registry.conf
内容如下
#docker registry
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
'' 'registry/2.0';
}
server {
listen 443 ssl;
server_name registry.ss.cn;
ssl_certificate /etc/nginx/conf.d/ssl/ss.cn_bundle.crt;
ssl_certificate_key /etc/nginx/conf.d/ssl/ss.cn.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
client_max_body_size 0;
chunked_transfer_encoding on;
location /v2/ {
#allow 124.42.50.175;
allow 106.121.103.16;
deny all;
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
auth_basic "Registry realm";
auth_basic_user_file /etc/nginx/conf.d/docker-registry.htpasswd;
add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
其中密码配置使用
htpasswd -Bbn admin 123456 > /etc/nginx/conf.d/docker-registry.htpasswd
springboot 项目使用docker部署运行
使用jib插件打包镜像
在pom.xml中配置插件如下
<!-- Jib插件 打包项目镜像推送到阿里云或者是私有的hub仓库中 --> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>1.7.0</version> <configuration> <!-- 拉取所需的基础镜像 - 这里用于运行springboot项目 --> <from> <image>openjdk:alpine</image> </from> <!-- 最后生成的镜像配置 --> <to> <!-- push到阿里云镜像仓库,如果是其它镜像仓库,将下面地址替换掉即可 --> <image>registry.私有仓库/镜像名:${project.version}-${image.release.version}</image> <auth> <username>账号</username> <password>密码</password> </auth> </to> <container> <!-- 主类的包名 --> <mainClass>com.xx.Application</mainClass> </container> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin>
配置好后 在右边点击plugins -> jib --> jib:build 会把镜像推送到镜像远程仓库,然后启动就可以了。
注意:点击 jib:build 前要修改 ${image.release.version} ,这个是镜像版本号。
还可以安装插件 docker registry explorer ,可以看到镜像仓库上传的镜像。