Docker 容器 容器是镜像运行时实例,用户可以从单个镜像上启动多个容器。 ID –ip 设置 ipv4地址 –ip6 设置 ipv6 地址 –rm 退出时自动移除容器 –volume , -v 绑定数据卷 –interactive , -i 即使未连接,也保持 STDIN 打开 –tty , -t 分配伪 TTY ( teletypewriter ) –name 命名一个容器 > 创建一个新的 Docker 容器 创建一个新的 Docker 容器的命令格式为 docker ID –ip 设置 ipv4地址 –ip6 设置 ipv6 地址 –rm 退出时自动移除容器 –volume , -v 绑定数据卷 –interactive , -i 即使未连接,也保持 STDIN 打开 –tty , -t 分配伪 TTY ( teletypewriter ) –name 命名一个容器 > 启动一个 Docker 容器 启动 Docker 容器的命令格式为 docker
自 2013 年起,随着 Docker 的正式面世,容器技术迅速成为了基础技术领域中的热门。而在近两三年中,随着容器编排领域的混战结束,Kubernetes 已经成为了容器编排领域事实上的标准。 当 Kubernetes 使用 Docker 作为容器运行时,用来启动应用;当 Docker 容器规模变大时,自然是需要有容器编排工具进行管理的。 01 容器是什么 Docker 在大多数人眼中几乎是容器(Container)的代名词,即使是现在我也会常听到有人说“我有几个 Docker 跑 xx 服务” 类似这样的话,无疑 Docker 引领了容器的时代 03 使用 Docker 面临的问题 我们要正视 Docker 是一个已经 6 岁的项目了,自它 1.0 发布以来已经 5 年之久了,因此它在生产环境中已经得到了大量的实践和验证,虽然不可避免的也会存在一些历史遗留问题 ,加深对 Docker 容器技术的理解。
我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有需要一个配置文件,负责实现对Docker容器集群的快速编排。 docker-compose 简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。 一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。 docker-compose挂后台运行 挂后台运行需加-d参数 docker-compose up -d 查看正在启动的docker容器使用docker ps [root@yoyo easymock]#
Propagation: RW:true Source:/app/docker/volumes/0955b631512898189af6c65b47098f6a791733f8ad560830726105608ba675ff Destination:/var/log/nginx Driver:local Mode: Name:afab7f34d4fa4dbcfae33ceadc0bc8b17fbfb79abdeabecda6cbe30cd861bef6 Propagation: RW:true Source:/app/docker/volumes/afab7f34d4fa4dbcfae33ceadc0bc8b17fbfb79abdeabecda6cbe30cd861bef6 5d8e597549062d7709b667457e278e33f15221cb5c8e112bcbb648b3bca59f04:RestartPolicyName=always,MaximumRetryCount=0 b28b6bd4264d9aad4eff7214df6d368c44b5c252a6d61bb7fd85ebc75ffdc957 :UTSMode= b28b6bd4264d9aad4eff7214df6d368c44b5c252a6d61bb7fd85ebc75ffdc957:UTSMode= 判断方法: 如果上述命令返回host
什么是 Docker? Docker 是一种工具,它让容器创建,部署和运行应用程序变得更加容易。 容器使开发人员可以将应用程序与所需的所有部分(如库和其他依赖项)打包在一起,并将其作为一个包进行部署。 启动 MySQL 容器 创建一个 Docker Volume,Volume 是用来储存状态的,这里就是用来存储数据的。 如此一来,就算我们不小心移除了 MySQL 容器,数据依然会保留下来: $ docker volume create tinylearn-vol 复制代码 启动容器: $ docker run --name /_/mysql 首次启动时,由于没有 MySQL 镜像,可能需要花 10 分钟左右下载(具体时间取决于网络环境): 下载完毕后会自动启动容器,我们可以通过以下命令查询容器状态: $ docker ps
前言 用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间 查看时间 先查看宿主机的系统时间 date -R 进docker容器查看时间 docker exec -it -u root 容器id /bin/bash 查看容器内部的系统时间,跟宿主机的不一致 date -R 查看容器内部系统时区,显示的是Etc/UTC root@cb8e397d5308:/# cat /etc/timezone Etc/UTC 修改容器时间 容器内部创建Asia时区文件 echo Asia/Shanghai >/etc/timezone localtime可以从宿主机拷贝到容器内部 (exit退出容器,在宿主机上操作docker cp) docker cp /usr/share/zoneinfo/Asia/Shanghai 容器id:/etc/localtime 查看Jenkins
docker run 使用镜像启动容器 docker ps 列出正在运行的容器 docker exec 在容器内执行另一个程序 docker stop 停止容器 docker start 将停止的容器再次启动 docker rm 删除容器 docker export 将容器内的文件系统导出 docker export -o rootfs.tar 容器ID 容器被停止后,docker ps命令就看不到该容器了 "MergedDir": "/var/lib/docker/overlay2/fa3166e545a2d1811dbeecb6f1fdda96b9f97b3cd629f32a8ea378aa79b1c780 /merged", "UpperDir": "/var/lib/docker/overlay2/fa3166e545a2d1811dbeecb6f1fdda96b9f97b3cd629f32a8ea378aa79b1c780 /diff", "WorkDir": "/var/lib/docker/overlay2/fa3166e545a2d1811dbeecb6f1fdda96b9f97b3cd629f32a8ea378aa79b1c780
一:什么是容器 如果容器理解为独立运行的一个或一组应用,以及它们的运行态环境。 而虚拟机则为可理解为跑在上面的应用。 二:创建容器 创建文件名为Dockerfile的空目录,将以下三个文件复制到其中。 修改为IP 5.后台运行应用程序 #docker run -d -p 4000:80 friendlyhello 6.查看容器 # docker container ls CONTAINER ID CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago 7.停止容器 :part2 四:附录: 如果想知道更多容器相关命令可试着运行下列命令 docker build -t friendlyname
locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f 使用命令docker start 容器id 即可启动已经存在的容器。 运行在前台,容器中使用exit命令或者调用docker stop、docker kill命令,容器停止。 ~$ docker inspect hello-world [ { "Id": "sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e Comment": "", "Created": "2019-01-01T01:29:27.650294696Z", "Container": "8e2caa5a514bb6d8b4f2a2553e9067498d261a0fd83a96aeaaf303943dff6ff9
容器(Container) : 镜像运行时的实体 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于独立的命名空间。上一篇文章提到镜像使用的是分层存储,而容器也是如此。 容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。 因此,任何保存于容器存储层的信息都会随容器删除而丢失。 按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。 所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。 数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run ,而数据却不会丢失。
启动容器 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态的容器重新启动 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@xs_test01 让容器的标准输入保持打开 使用docker run创建容器时,docker在后台运行的标准操作包括: 检查本地是否存在指定的镜像,不存在就从公有仓库下载 利用镜像创建并启动一个容器 分配一个文件系统, # docker stop 9e3a4d40497c 9e3a4d40497c 进入容器 当我们使用-d参数时,容器启动后会进入后台,这个时候当我们需要进入容器里进行操作时,可以通过使用attach和 2 3 4 5 6 7 8 9 10 获取容器ID [root@xs_test01 docker]# docker container ls -a CONTAINER docker]# docker container rm d7c0bf8ea467 #必须删除是处于终止状态的容器 d7c0bf8ea467 清理所有处于终止状态的容器 1 2 3 4
docker ps docker ps -a #显示所有状态容器 docker stop xx 进入容器 docker exec -it xx /bin/bash ? image.png 持续查看日志 docker logs -f xxx 容器分为两种:服务类容器或工具类容器 服务类容器:-d 工具类容器:-it start/stop/restart 服务类容器: 自动重启 docker run -d --restart=always httpd restart=on-failure:3 pause 暂停容器 /unpause docker rm 删除容器 docker rmi 删除镜像 容器状态转换图 ? image.png 容器的实现: cgroup 实现资源配额 namespace 实现资源隔离 ? image.png
Docker 容器 操作 Docker 容器 Docker 启动容器 Docker 守护态运行 Docker 终止容器 Docker 进入容器 Docker 导出和导入容器 Docker 删除容器 操作 Docker 容器 容器是 Docker 又一核心概念。 Docker 终止容器 可以使用 docker container stop 来终止一个运行中的容器。 此外,当 Docker 容器中指定的应用终结时,容器也自动终止。 $ docker run -dit ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ docker container $ docker run -dit ubuntu 69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6 $ docker container
一、Docker容器的基本概念 1.1 Docker容器是什么? Docker容器是一种轻量级、可移植的虚拟化技术,用于打包、运输和运行应用程序及其所有依赖项。 1.2 Docker镜像与容器的关系 Docker镜像和容器之间有着密切的关系,它们是Docker技术中两个核心概念,相辅相成,共同构建了Docker容器化的环境。 镜像是应用程序的构建块,它可以作为模板用于创建容器实例。 Docker容器: Docker容器是Docker镜像的运行实例,它是一个独立的、可执行的进程,具有自己的文件系统、网络和进程空间。 工作原理: 当用户运行一个Docker容器时,Docker引擎会根据指定的镜像创建一个新的容器实例。 Docker Swarm: Docker Swarm是Docker官方提供的容器编排工具,用于管理和调度多个Docker容器,构建和管理容器集群。
Docker 容器镜像删除 1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令 : docker rm $(docker ps -a -q) 2.查看当前有些什么images docker images 3.删除images,通过image的id来指定删除谁 docker rmi <image id> 想要删除untagged images,也就是那些id为<None>的image的话可以用 docker rmi ? 3}") 要删除全部image的话 docker rmi $(docker images -q)
实现命令如下: [root@localhost /]# docker search mysql(查找mysql镜像,此处如果无法获取到镜像,则可能是网络问题,需要保证虚拟机可以联网) [root@localhost /]# docker pull mysql(拉取mysql镜像) [root@localhost /]# docker image ls(查看所有的镜像) [root@localhost /]# docker ---- 2、拉取最新的mysql镜像 ---- 查看当前所有的镜像,验证是否拉取mysql镜像成功 3、运行mysql容器 ---- 4、进入这个mysql容器中 ---- 5、 创建测试的数据库 ---- 6、本地使用数据库工具连接这个mysql容器 地址:192.168.79.128(虚拟机的IP地址,可以通过ifconfig命令查看) 用户名:root 密码:123456 (启动mysql容器时设置的) 端口:3666(启动mysql容器时设置的) ---之前启动mysql容器的命令为:[root@localhost /]# docker run --name zoey-mysql
问题现象 centos 启动一个容器添加了-d 参数,但是docker ps 找不到容器,docker ps -a查看却已经退出了 [root@VM_0_6_centos ~]# docker run docker ps 找不到容器信息 [root@VM_0_6_centos ~]# docker ps -a status列显示已退出 [root@VM_0_6_centos ~]# docker logs centos 没有任何异常日志 退出原因 1、docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出 2、容器运行的命令如果不是那些一直挂起的命令( 运行top,tail、循环等),就是会自动退出 3、这个是 docker 的机制问题 解决方案 方案1: 网上有很多介绍,就是起一个死循环进程,让他不停的循环下去,前台永远有进程执行,那么容器就不会退出了 shell>docker ps 容器运行起来了 进入容器的方法: 使用exec,不要使用attach命令 attach命令就是使用现有终端,如果你要退出容器操作,那么bash结束,容器也就退出了
,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台 二、Docker基础 1.docker rmi命令删除镜像;docker rm删除容器;都提供-f选项,可强制删除存在容器的镜像或启动中的容器 ,三是进程管理,调用方为Docker的execdriver D.Docker镜像管理 1.Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需的文件系统结构及其内容,因此是启动一个 Docker容器的基础,镜像文件内容以及一些运行Docker容器的配置文件组成了Docker容器的静态文件系统运行环境——rootfs 2.rootfs是Docker容器在启动时内部进程可见的文件系统, 与容器安全 1.Docker安全问题 磁盘资源限制问题 容器逃逸问题 容器DoS攻击与流量限制问题 超级权限问题 2.Docker安全的解决方案:SELinux、磁盘限额、宿主机内容器流量限制、GRSecurity 镜像 C.Docker容器的监控手段 1.监控命令:docker ps、docker images、docker stats、docker inspect、docker top、docker port
需求: 后端服务可以随时备份mysql容器的数据库。以下以oa-mysql作为mysql容器名,数据库名称以oa举例示范。 docker exec -i oa-mysql mysqldump -u ${user} -p${dbpwd} --lock-all-tables --databases oa> oa.sql 容器通过调用宿主机命令 ,直接操作其他容器 该种方式可参考,《Docker容器内执行宿主机指令》文章。 dkedTeam // Author: GJing // Date: 2023/6/9$ 18:24$ package docker import ( "context" "github.com = nil { } dockerClient = c return } // Exec // @Description docker容器内执行命令 // @params // @contact.name
Docker容器内不能联网的6种解决方案 注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping 8.8.8.8) 1.使用--net: host选项 sudo docker run --net:host --name Ubuntu_bash -i -t ubuntu:latest /bin/bash 2.使用--dns选项 sudo docker 去掉“docker_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"”前的#号 4.不用dnsmasq vi /etc/NetworkManager/NetworkManager.conf 在dns=dnsmasq前加个#号注释掉 sudo restart network-manager sudo restart docker 5.重建docker0网络 pkill docker iptables -t nat -F ifconfig docker0 down brctl delbr docker0 docker -d 6.直接在docker内修改/etc/hosts