-
容器命令:
1.启动容器
接下来演示在docker下运行一个ubuntu系统,从中学习各容器命令。
--name="容器新名字" 为容器指定一个名称(不指定的话会随机分配一个名字)。
-d: 后台运行容器并返回容器ID,也就启动守护式容器(后台运行)
-i: 以交互模式运行容器,通常与-t同时使用
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用。
也即启动交互式容器(前台有伪终端,等待交互)
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p 注:一般用这个比较多
--restart=always: 指明docker整体重启后改容器也会重启
/bin/bash: 放在镜像后面是命令,这里希望有个交互式shell,因此使用/bin/bash
先拉取一个ubuntu系统镜像
docker pull ubuntu
启动容器时需要有终端进行交互,不然你会发现执行后啥都没有
这里启动一个Ubuntu的镜像
没有自定义名字启动容器
[root@localhost ~]# docker run -it ubuntu /bin/bash
自定义名字启动容器
[root@localhost ~]# docker run -it --name myubuntu1 ubuntu /bin/bash
此时可以看到已经进入Ubuntu系统了
上述操作其他的几个参数都用到了,唯独守护进程没有用,为什仫呢?
首先我们先来了解一下什么是守护进程吧
Docker守护进程(Docker daemon)是Docker引擎的核心组件之一,它是一个在后台运行的持续运行的进程。它负责管理Docker容器的生命周期、镜像的构建和管理、网络的管理,以及与Docker客户端的通信等任务。
守护进程是在计算机操作系统中运行的一种特殊类型的进程。它通常在系统启动时启动,并一直运行着,负责处理系统级别的任务和服务。与普通进程不同,守护进程通常不与用户直接交互,而是在后台默默地执行它们的任务。
在Docker中,守护进程充当了Docker引擎的后台管理者。它监听Docker客户端发出的命令和请求,负责启动、停止、管理容器,管理镜像的构建和存储,创建和管理网络等。守护进程还负责监控容器的状态,并根据需要进行自动调整和管理。
通过与Docker客户端的通信,用户可以使用命令行工具或API与Docker守护进程进行交互,从而创建、管理和部署容器化应用程序。
总结来说,Docker守护进程是Docker引擎的核心组件,它在后台运行并负责管理和执行Docker容器的操作。守护进程作为一种特殊类型的后台进程,处理系统级别的任务和服务,与用户不直接交互。
所以我们大致应该能明白守护进程是给需要在后台默默执行的程序。如redis,如果不添加守护进程,ctrl+c,前台进程结束,容器就停止了,显然不能接受。
通过下图可以看到redis开始在正常运行在前台,假如说我要执行其他程序,然后我ctrl+c退出了一下,redis就自动退出了
查看容器的状态,发现也是退出了
但是添加-d后,它会直接在后台运行,不会在前台占用资源
注意:对于一些需要在前台进行的操作的容器,不能随意使用-d,如centos,unbuntu系统这种,需要在终端显现出来进行操作。
2.查看容器状态
格式:docker ps -参数
这里不一一列举了,我认为学习的本质是思维的提升,死记硬背是不倡导的,记不住很正常,重要的是知道如何查询。
常用的参数
-a:查看所有容器
-n:指定一个数字,然后查询指定数字最近启动过的容器
更多参数见 docker ps –help
3.退出容器:
方法一:exit退出
方法二:ctrl+p+q退出
退出容器后相应的进程随之关闭。
4.启动已停止运行的容器
- 启动容器:
docker start 容器id或容器名
- 重启容器:
docker restart 容器id或容器名
- 停止容器:
docker stop 容器id或容器名
- 强制停止容器:
docker kill 容器id或容器名
- 删除已停止的容器:
容器需要先停止才能删除
docker rm 容器id/容器名
docker rm -f 容器id (强制删除)
注: rmi删的是镜像;rm删的是容器。
- 查看容器日志:
docker logs 容器id/容器名
注:docker run之后容器没有成功启动可通过“docker logs 容器id”查看失败日志。
- 查看容器内运行的进程:
docker top 容器id/容器名
- 查看容器内部结构:
更细致地查看容器的情况,后续会用到docker inspect 容器id
5.进入正在运行的容器
有两种方法:
exec交互式进入:
docker exec -it 容器id /bin/bash
exec是在容器中打开一个新的终端,启动了新的进程。用exit退出不会导致容器的停止。下次使用时重新进入即可不需要再启动,这种较方便。
attach方式进入:
docker attach 容器id
attach直接进入容器启动命令的终端,不会启动新的进程。显然此时用exit退出的话会导致容器停止。
-
6.从容器内拷贝文件到主机
备份真的很重要!!!
格式:
docker cp 容器id:容器内路径 目的主机路径
模拟一下备份的操作:
进入ubunbu容器,创建一个需要备份的文件
[root@localhost ~]# docker exec -it myubuntu1 /bin/bash
root@7ee020b6f11f:/# mkdir /tmp/backup
root@7ee020b6f11f:/# echo "backup" >/tmp/backup/1.txt
root@7ee020b6f11f:/# cat /tmp/backup/1.txt
backup
回到主机进行备份操作
root@7ee020b6f11f:/# exit
exit
[root@localhost ~]# mkdir /备份
[root@localhost ~]# docker cp 7ee020b6f11f:/tmp/backup/1.txt /备份
Successfully copied 2.05kB to /备份
[root@localhost ~]# ls /备份
1.txt
[root@localhost ~]# cat /备份/1.txt
backup
导入和导出容器:
这是对整个容器进行备份
格式:
备份(导出)到本地:
docker export 容器id > 文件名.tar
导入容器:
cat 文件名.tar | docker import 镜像用户/镜像名:镜像版本号
假设备份的这个容器不小心删除了,进行恢复操作
对容器进行备份
对容器进行删除
对容器进行恢复:
-
7.基于容器制作镜像 —— docker commit。
通过docker commit可以提交容器副本使其称为一个新的镜像;就是说对一个具体的容器采用类似“反射”的方式生成模板镜像。
格式:docker commit -m="描述信息" -a="作者" 容器id 要创建的目标镜像名:[TAG]
选择刚才进行恢复操作的容器,对其再进行反向生成镜像ubuntu2
我们知道官网默认的ubuntu是个极简的版本,简略到vim都是没有的。
所以接下来我们进入容器对其进行安装vim编辑器
#先更新管理工具
apt-get update
#安装vim
apt-get -y install vim
然后进去随便编辑一个文件,测试是否安装成功了
8.docker容器数据卷
定义:将容器内的数据保存进宿主机磁盘,以实现容器内数据持久化存储或共享
卷就是目录或文件,可以存在一个或多个容器中,做数据卷的意义就在于让数据持久化,它可以完全独立于容器的生命周期,简而言之即使容器被删除,它也依旧存在。
数据卷的特点:
数据卷可在容器之间共享或重用数据
卷中的更改实时生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
格式:docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录 镜像名
注:该指令会默认创建宿主机、容器中不存在的路径
给宿主机与容器之间添加容器卷映射
[root@localhost ~]# docker run -it --privileged=true -v /tmp/ubuntu_data:/tmp/docker_data --name=ubuntu1 b1e9cef3f297
root@93327d8fc361:/# ls /tmp
docker_data
root@93327d8fc361:/# exit
exit
[root@localhost ~]# ls /tmp
systemd-private-c8c86f15dbdc47488d4c4652a466b7e2-chronyd.service-TzIZ9w ubuntu_data vmware-root_708-299893653
也可以通过查看容器内部结构,查看绑定情况(docker inspect):
[root@localhost ~]# docker inspect 93327d8fc361 #容器id
容器停止后在宿主机路径下的修改在容器重新启动后也会存在
在本地映射的路径下编辑一个文本
[root@localhost ~]# vi /tmp/ubuntu_data/1.txt
你好,我是来测试的
~重新启动容器并进入
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93327d8fc361 b1e9cef3f297 "/bin/bash" 28 minutes ago Exited (0) 27 minutes ago ubuntu1
[root@localhost ~]# docker start 93327d8fc361
93327d8fc361
[root@localhost ~]# docker exec -it 93327d8fc361 /bin/bash
root@93327d8fc361:/# cat /tmp/docker_data/1.txt
你好,我是来测试的
卷的继承和共享:
接下来在创建ubuntu2的时候指定继承ubuntu1的容器数据卷。此时就可以实现容器ubuntu1、容器ubuntu2、宿主机三者之间的数据共享。
创建容器ubuntu2,创建的时候继承ubuntu1的容器卷,验证数据是否共享
注意:ubuntu2继承的是ubuntu1的卷规则,所以u1挂了丝毫不影响u2因为他们是两个完全不同的容器。
-
私有仓库的部署
这里有两种私有仓库,一种是docker自带的本地私有仓库
另一种是harbor私有仓库。
1、私人建立本地Docker Registry
下载镜像docker registry至本地
docker pull registry
运行私有库registry
[root@localhost ~]# docker run -d -p 5000:5000 -v /tmp/myregistry/:/tmp/registry --privileged=true registry:latest
241b19cd8b20daeee01f1d92fc5140f2da87097fcc0005e601b1350af7c74c71
启动容器
进入docker配置文件
[root@localhost ~]# vi /etc/docker/daemon.json
添加一行数据:
"insecure-registries": ["192.168.143.160:5000"]
重启docker
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
查询我们这个库看看有什么镜像(最初一般都啥也没有
[root@localhost ~]# curl http://192.168.143.160:5000/v2/_catalog
{"repositories":[]}
拉取一个redis的镜像,再给镜像打上标签
docker tag redis:latest 192.168.143.5000/redis:latest
推送到本地
[root@localhost ~]# docker push 192.168.143.160:5000/redis:latest
The push refers to repository [192.168.143.160:5000/redis]
32dc2b2f3fdb: Pushed
5f70bf18a086: Pushed
699126e5b0cf: Pushed
f4d5f0e4a5a3: Pushed
67c428dd15b2: Pushed
12968755fd7a: Pushed
ae5bfa089f9f: Pushed
8d853c8add5d: Pushed
latest: digest: sha256:08253b414e0a11ae685bc3eec7e978b85a4c706d2dad1cc1ace92fbe6830953d size: 1986
验证是否拉取到私有仓库
[root@localhost ~]# curl http://192.168.143.160:5000/v2/_catalog
{"repositories":["redis"]}
2.harbor私有仓库的部署
- 虽然Docker官方提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。
- Harbor是由VMware公司开源的企业级的Docker Registry管理项目,相比docker官方拥有更丰富的权限权利和完善的架构设计,适用大规模docker集群部署提供仓库服务。
- 它主要提供 Dcoker Registry 管理界面UI,可基于角色访问控制,镜像复制, AD/LDAP 集成,日志审核等功能,完全的支持中文。
安装docker-compose:
这里我采用的是离线安装的方式:
上传docker-compose到虚拟机
[root@localhost ~]# ls
anaconda-ks.cfg backup.tar docker-compose my_hello myhello_world.tar
对文件添加执行权限:
[root@localhost ~]# ll
总用量 120804
-rw-------. 1 root root 1257 9月 23 17:20 anaconda-ks.cfg
-rw-r--r--. 1 root root 80625664 10月 11 13:14 backup.tar
-rw-r--r--. 1 root root 17031320 10月 11 18:09 docker-compose
-rw-------. 1 root root 24577 9月 26 09:13 my_hello
-rw-------. 1 root root 26008064 9月 29 11:44 myhello_world.tar
[root@localhost ~]# chmod +x docker-compose
移动 docker-compose 程序文件到 /usr/bin 目录下
[root@localhost ~]# mv docker-compose /usr/bin
mv:是否覆盖"/usr/bin/docker-compose"? y
查看docker-compose 是否生效
[root@localhost ~]# docker-compose --version
docker-compose version 1.25.0, build 0a186604
安装 Harbor 私有镜像仓库
上传 harbor 离线镜像包
root@localhost ~]# ls
anaconda-ks.cfg backup.tar harbor-offline-installer-v2.4.3.tgz my_hello myhello_world.tar
解压
[root@localhost ~]# tar -zxvf harbor-offline-installer-v2.4.3.tgz
harbor/harbor.v2.4.3.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/common.sh
harbor/harbor.yml.tmpl
进入该工作目录,导入harbor镜像文件
[root@localhost harbor]# cd
[root@localhost ~]# cd harbor
[root@localhost harbor]# ls
common.sh harbor.v2.4.3.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
[root@localhost harbor]# docker load -i harbor.v2.4.3.tar.gz
这里配置文件需要改名
采用备份的方式改名,既能起到改名的效果,还能备份
[root@localhost harbor]# ls
common.sh harbor.v2.4.3.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
[root@localhost harbor]# cp harbor.yml.tmpl harbor.yml
[root@localhost harbor]# ls
common.sh harbor.v2.4.3.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare
修改配置文件:
[root@localhost harbor]# vi harbor.yml
# Configuration file of Harbor
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: 192.168.143.160 #改为主机ip
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
https:
# https port for harbor, default is 443 注释https方式访问因为他需要有效证书才能使用
# port: 443 注释https端口
# The path of cert and key files for nginx
# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: 12345 #harbor登录密码
# certificate: /your/certificate/path 注释证书文件
# private_key: /your/private/key/path 注释证书密钥文件
# # Uncomment following will enable tls communication between all harbor components
# internal_tls:
# # set enabled to true means internal tls is enabled
# enabled: true
# # put your cert and key files on dir
# dir: /etc/harbor/tls/internal
# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433
执行安装脚本
[root@localhost harbor]# ls
common.sh harbor.v2.4.3.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare
[root@localhost harbor]# ./install.sh
最后出现以下提示安装成功
✔ ----Harbor has been installed and started successfully.----
查看安装的容器
修改docker配置文件:
本机指定 Harbor 仓库地址,指定后可在本机进行镜像文件的上传与下载,其他主机需要使用 Harbor 私有仓库时,也需修改成内容
[root@localhost ~]# vi /etc/docker/daemon.json
"insecure-registries": ["192.168.143.160"] #没有只需要添加这一部分,有就在原来的基础上修改
重启docker和配置文件
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
重启 Harbor 仓库(docker 重启后,Harbor 相关组件并不会自动重启,需要手动重启)
还需注意必须在harbor工作目录下重启,不然docker-compose找不到位置
先down掉:
[root@localhost ~]# cd harbor
[root@localhost harbor]# docker-compose down
Stopping harbor-log ... done
Removing nginx ... done
Removing harbor-jobservice ... done
Removing harbor-core ... done
Removing redis ... done
Removing registryctl ... done
Removing registry ... done
Removing harbor-portal ... done
Removing harbor-db ... done
Removing harbor-log ... done
Removing network harbor_harbor
再启动:
[root@localhost harbor]# docker-compose down
Stopping harbor-log ... done
Removing nginx ... done
Removing harbor-jobservice ... done
Removing harbor-core ... done
Removing redis ... done
Removing registryctl ... done
Removing registry ... done
Removing harbor-portal ... done
Removing harbor-db ... done
Removing harbor-log ... done
Removing network harbor_harbor
[root@localhost harbor]# docker-compose up -d
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registry ... done
Creating redis ... done
Creating harbor-db ... done
Creating harbor-portal ... done
Creating registryctl ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating nginx ... done
浏览器登录
用户名为admin,而密码为在harbor.yml设置的密码
测试上传镜像到私有仓库会不会同步显示
再新建一个项目
这里我已经新建的test1项目,这里主要在于演示
先要给镜像打上标签,才能上传
[root@localhost ~]# docker tag nginx:latest 192.168.143.160/test1/nginx:latest
登录到harbor上
[root@localhost ~]# docker login -u admin -p 12345 http://192.168.143.160
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
这里如果出现登录不上解决办法:
去到系统里的docker服务文件
vi /usr/lib/systemd/system/docker.service
在13行中间添加--insecure-registry 192.168.143.160
13 ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.143.160 --containerd=/run/containerd/containerd.sock
然后重启配置文件和docker就能登录了
systemctl daemon-reload
systemctl restart docker
上传镜像
[root@localhost ~]# docker push 192.168.143.160/test1/nginx:latest
The push refers to repository [192.168.143.160/test1/nginx]
11de3d47036d: Pushed
16907864a2d0: Pushed
2bdf51597158: Pushed
0fc6bb94eec5: Pushed
eda13eb24d4c: Pushed
67796e30ff04: Pushed
8e2ab394fabf: Pushed
latest: digest: sha256:596c783ac62b9a43c60edb876fe807376cd5022a4e25e89b9a9ae06c374299d4 size: 1778
去浏览器查看是否同步创建
可以看到已经有了说明成功了