【云计算•云原生】3.一小时熟练掌握docker容器

这篇具有很好参考价值的文章主要介绍了【云计算•云原生】3.一小时熟练掌握docker容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

docker简介

docker是一个开源的应用容器引擎,可以让开发人员把编写好的代码和运行代码所需要的环境打包进一个容器里,通过移植容器可以避免多次搭建环境以及代码在一台机器上可以运行而到了另一台机器上因环境问题报错。

区分镜像和容器
用户基于镜像来运行容器,可以把镜像和容器类比成类和对象

docker、dockerfile与docker-compose区别
docker是一个可以基于镜像创建容器的软件
dockerfile把手工安装docer镜像的过程变成一个配置文件脚本,以后只需要运行这个文件就可获得所需环境
docker-compose用于编排容器。通过编辑docker-composer.yml配置文件,可以一个命令启动多个需要不同参数配置的容器

docker和虚拟机的区别

简单来说docker不需要一个单独的客户机操作系统,而是借助了宿主机。(应该是这样)
【云计算•云原生】3.一小时熟练掌握docker容器

ubuntu下安装docker

ubuntu下安装docker,一条命令即可
curl -sSL https://get.daocloud.io/docker | sh

镜像加速,去阿里云拿加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

 $ sudo mkdir -p /etc/docker
 $ vim /etc/docker/daemon.json
 # 加入以下代码
 {
   "registry-mirrors": ["加速器地址"]
 }
 
 $ sudo systemctl daemon-reload
 $ sudo systemctl restart docker

kali下安装docker

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
echo 'deb https://download.docker.com/linux/debian stretch stable'> /etc/apt/sources.list.d/docker.list
如果显示没有权限,就运行下面这条命令
echo "deb https://download.docker.com/linux/debian stretch stable"  | sudo tee -a /etc/apt/sources.list.d/docker.list
apt-get install apt-transport-https  ca-certificates  curl  gnupg2  software-properties-common
sudo apt-get update
sudo apt install docker.io
如果报错用下面这条命令
apt-get install docker-ce
docker --version

docker基本命令

重启dockersystemctl restart docker

停止运行dockersystemctl stop docker

查看版本:docker version

列出本地的镜像:docker images

查找镜像:例docker search ubuntu

拉取镜像:docker pull 镜像名[:版本]

删除镜像:docker rmi ubuntu

创建交互式容器:docker run -i -t --name=name1 centos /bin/bash

-i:交互式容器
-t:tty终端
-d:守护式容器
–name:指定容器名称

查看正在运行的容器:docker ps

查看运行过的容器:docker ps -a

查看最后一次运行的容器:docker ps -l

退出当前容器:exit

创建守护式容器(不会自动登录进去):docker run -di --name=运行后的名字 镜像名字

登录进去docker exec -it 正在运行的容器名字 /bin/bash

ctrl+p+q退出容器,但不关闭

创建容器并登录进去:docker run -it --name=运行后的名字 镜像名字 /bin/bash

也可以用docker attach 容器名

attach 不会在容器中创建进程执行额外的命令,只是附着到容器上.
exec 会在运行的容器上创建进程执行新的命令。

停止运行容器:docker stop 容器名字

开启已有的容器:docker start 容器名字

docker start 指定一个容器
docker run 指定一个镜像

查看容器的详细信息:docker inspect c1

查看容器运行日志docker logs c1

删除容器:docker rm 容器名称/容器id,注意不能删除正在运行的容器

文件拷贝:
docker cp 待拷贝的文件或目录 容器名称:容器目录
docker cp 容器名称:容器目录 带拷贝的文件或目录

目录挂载
创建容器的时候,将宿主机的目录与容器的目录进行映射,这样就可以通过修改宿主机的某个目录文件去影响容器
-v 宿主机目录:容器目录
docker run -di --name=自定义容器名 -v /opt/:/usr/local/myhtml 镜像名

":"前面的目录是宿主机目录,后面的目录是容器内目录。

docker exec -it 容器名 /bin/bash

docker搭建mysql、nginx、redis

mysql
docker pull mysql:5.7
docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7

-di 守护方式交互方式
-p 3306:3306(端口映射-p 宿主机端口:容器端口)
-e MYSQL_ROOT_PASSWORD=root设置环境变量
mysql:5.7 镜像

docker exec -it mysql /bin/bash
docker -u root -p root

nginx
docker pull nginx
docker run -di --name=nginx -p 80:80 nginx [可以创建的之后直接将容器文件挂载到宿主机某一目录]

redis
docker pull redis
docker run -di --name=redis -p 6379:6379 redis

容器/镜像打包

  • 可以通过scp命令将打包的镜像上传到其他服务器(机器) scp xx.tar 其他服务器ip:/root/xx.tar

  • export容器打包:(但最好还是用save存储打包
    1、容器打包:docker export -o /root/xx.tar t1
    2、导入容器:docker import xx.tar mytomcat:mycersion

  • 容器打包为镜像并上传到dockerhub(重要)

    • 制作镜像docker commit 容器名 想要创建的镜像名:版本号
    • 登录dockerhub,创建一个仓库
    • 本地连接镜像和仓库docker tag 创建的镜像名:版本号 dockerhub用户名/仓库名:版本号
    • 本地登录账户并push镜像docker logindocker push dockerhub用户名/仓库名:版本号

save镜像打包:docker save -o /root/xx.tar 新镜像名字

导入镜像:docker load -i /root/xx.tar之后会产生一个新的镜像,之后正常使用

导出后再导入(exported-imported)的镜像会丢失所有的历史,而保存后再加载(saveed-loaded)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚来回滚之前的层)。

搭建私有镜像仓库

私有仓库本身也是一个镜像

拉取私有仓库镜像docker pull registry

创建docker run -di --name=registry -p 5000:5000 registry
打开浏览器输入http://自己ip:5000/v2/_catalog,看到{"repositories":[]}
表示私有仓库搭建成功并且内容为空

修改/etc/docker/daemon.json,让docker信任私有仓库
添加{"insecure-registries":["自己ip:5000"]}

重启docker
systemctl restart docker

打标签
docker tag 上传的镜像名字 ip:5000/自己设定的镜像名字:标签名

上传
docker push ip:5000/自己设定的镜像名字:标签名

拉取私有仓库镜像
先让docker信任私有仓库
修改/etc/docker/daemon.json添加{"insecure-registries":["自己ip:5000"]}
docker pull 镜像名字

docker网络管理

查看docker网络:docker network ls

docker中默认网络分为bridge、host、none。

bridge可以与互联网通信,host和none不可以与外界网络通信

  • 容器间的通信实验

1、创建两个使用默认bridge网络容器
docker run -it --name=c1 busybox
docker run -it --name=c2 busybox
2、创建一个使用自定义的mynet网络(需要预先创建)的容器
docker network create --driver bridge mynet
docker run --network=mynet -it --name=c3 busybox
3、为容器2新增一个自定义的mynet网络连接
docker network connect mynet c2

此时容器c1和c3各有一块网卡,c2有两块网卡。
c1和c2, c2和c3可以通信,但是c1和c3不能通信。

Dockerfile文件

Dockerfile使用基于DSL语法的指令来构建一个docker镜像,之后使用docker bulide命令来构建一个新的镜像再次强调Dockerfile的作用就是用来制作镜像。

Dockerfile语法

| FROM      构建新镜像基于的基础镜像 
| LABEL     标签
| RUN       构建镜像时运行的Shell命令                 
| COPY      拷贝文件或目录到镜像中                     
| ADD       解压压缩包并拷贝                        
| ENV       设置环境变量                             
| USER      为RUN、CMD和ENTRYPOINT执行命令指定运行用户   
| EXPOSE    声明容器运行的服务端口                         
| WORKDIR   为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录   
| CMD       运行容器时默认执行,如果有多个CMD指令,最后一个生效 

构建镜像步骤
1、创建一个目录
2、在目录下创建Dockerfile文件以及其他文件
3、通过docker builde构建镜像
4、通过构建的镜像启动容器

docker-compose.yml

如果只有一个docker镜像作为服务的话,只需要做好这一个镜像,然后用docker的run命令启动起来就可以了。但是如果是一个很大的服务的话,需要启动好几个容器来共同协作,这时如果手动docker run来启动好几个容器就显得比较繁琐,这时就可以用docker-compose.yml来规定从那些镜像开启容器,同时映射端口即其他的一些内容。

简单的语法示例

version: '3'   # compose-file的语法版本
services:    # 定义服务
  web:      # 指定服务1 web
    build: .    # 使用当前目录下的Dockerfile构建镜像
    ports:    # 指定端口映射
      - "9999:9999"
    container_name: flask_web  # 容器名称 container_name+services_name 会作为镜像名称
  redis:
    image: "redis:alpine"
    volumes:   # 指定数据卷
      - redis-data:/data
    container_name: redis

可以看到可以指定Dockerfile从头开始构建一个镜像然后创建容器,也可以用现成的镜像构建容器。

docker-compose命令

docker-compose up  启动服务
docker-compose up -d  后台启动服务
docker-compose down   卸载服务(容器也会被删除)
docker-compose logs  当后台启动服务的时候,可以使用这种方式查看日志

示例:搭建lamp

注意这里用docker-compose.yml只开启一个镜像的容器,其实可以开很多不同的镜像。

创建一个文件夹lab2并进入

添加index.php

<?php
    echo "hello world~";
?>

编写Dockerfile文件

FROM tutum/lamp 
# 换源
RUN sed -i "s/http:\/\/archive.ubuntu.com/http:\/\/mirrors.aliyun.com/g" /etc/apt/sources.list 
RUN apt-get update -y
# 删除环境原本的一堆东西
RUN rm /var/www/html/*  
# 源码copy进去目录,可自行修改
COPY ./index.php /var/www/html/
WORKDIR /var/www/html/
RUN chown www-data:www-data /var/www/html/* -R
RUN chmod -R 755 /var/www/html/
RUN service apache2 restart
EXPOSE 80
CMD ["apachectl", "-DFOREGROUND"]

执行docker build -t='myhello' .成功创建myhello:latest镜像

同目录下编写docker-compose.yml

version: "3"
services:
  web:
    image: "myhello:latest"
    container_name: "myweb"
    ports:
      - "80:80"

开启容器sudo docker-compose up -d

之后可以从物理机访问虚拟机ip的80端口。

关闭容器sudo docker-compose down

可以通过sudo docker inspect myweb1查看此容器的一些配置信息。文章来源地址https://www.toymoban.com/news/detail-455688.html

到了这里,关于【云计算•云原生】3.一小时熟练掌握docker容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker容器的时间和宿主机时间不一致相差8小时

    在docker容器和系统时间不一致是因为docker容器的原生时区为0时区,而宿主机时间是+8个时区 先要确认宿主机时间是否正确 可以使用date命令 如果时间错误,则先进行对时 运行 docker run 添加 -v /etc/localtime:/etc/localtime 选项,如下: 如果统一时区还需要添加-v /etc/timezone:/etc/time

    2024年02月12日
    浏览(55)
  • 指针从入门到熟练掌握

    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:@rivencode的个人主页 🔥系列专栏:玩转C语言 💬保持学习、保持热爱、认真分享、一起进步!! 指针就是C语言的灵魂,想要学好C语言指针这一关必须过,既然是灵魂必须难度必然

    2024年02月02日
    浏览(32)
  • 掌握WPF控件:熟练常用属性(二)

    Calendar 用于日期选择的控件。它提供了一个可视化的界面,可以通过它来选择特定的日期。 常用属性 描述 DisplayMode 用来设置Calendar的显示模式,有三种可选值:默认Month(月)、Year(年)和Decade(十年)。 SelectedDate 用来获取或设置当前选中的日期。 Mode 用来设置Calendar的显

    2024年01月20日
    浏览(92)
  • 掌握WPF控件:熟练常用属性(一)

    Border Border控件是一个装饰控件,用于围绕其他元素绘制边框和背景。它提供了一种简单的方式来为其他控件添加边框和背景样式,而无需自定义控件的绘制逻辑。 常用属性 描述 Background 用于设置背景颜色或图像。 BorderBrush 用于设置边框的边框颜色 CornerRadius 用于设置边框的

    2024年01月21日
    浏览(43)
  • 熟练掌握ChatGPT解决复杂问题——学会提问

    目录 引言 一、5W1H分析法 1. 简单的问题(what、where、when、who) 2.复杂的问题(why、how) 2.1 为什么(Why)——原因 2.2 方式 (How)——如何 二、如何提问得到更高质量的答案 ? 1. 乔哈里的沟通视窗(四象限) 2. 盲区 3. 公开区 3.1 检验自我的认知问法 3.2 扩充认知的问法

    2024年02月13日
    浏览(37)
  • 熟练掌握Linux中增加磁盘与分区

    1.1 分区的作用 优化I/O(读写)性能 实现磁盘空间配额限制 提高修复速度 隔离系统和程序 安装多个OS 采用不同文件系统 1.2 mbr分区 MBR 分区 只可以对2T 以下的硬盘进行分区 一个扇区 512 字节(前 446 是引导程序,后面64字节中有4个16字节的分区表,还有2字节作为标记位) 1

    2024年02月03日
    浏览(36)
  • 浅识XPath(熟练掌握XPath的语法)

    XPath是一种用于在XML和HTML文档中定位和遍历元素的语言。在Web开发中,XPath是非常重要的技能之一。掌握XPath的语法可以帮助开发人员更快速地解析和提取数据。 XPath使用路径表达式来定位和遍历元素。下面是一些XPath的基本语法: 以双斜杠(//)开头表示搜索整个文档中的所

    2024年02月03日
    浏览(37)
  • 熟练掌握并充分利用CSS3的新特性,更新完毕。

    1.1   尝试新颖的CSS3特性 首先,我们来看一个具体的案例。  https://code.juejin.cn/pen/7277536985772720139   1.2  CSS3新特性简介和浏览器支持情况 新特性简介: 1)强大的CSS3选择器 2)抛弃图片的视觉效果 3)盒模型变化(多列布局和弹性盒模型 ) 4)阴影效果 5)Web字体和web Font 图标

    2024年02月08日
    浏览(38)
  • 云原生Docker容器管理

    目录 docker容器的管理 容器创建  查看容器的运行状态 启动容器 创建并启动容器  终止容器运行  删除容器  容器的进入  查看容器详细信息 复制到容器中 从容器复制文件到主机 容器的导出与导入 导出  导入 相当于一个进程,性能接近于原生,几乎没有损耗; docker容器在

    2024年02月07日
    浏览(56)
  • 容器和云原生(二):Docker容器化技术

      目录 Docker容器的使用 Docker容器关键技术 Namespace  Cgroups UnionFS         首先直观地了解docker如何安装使用,并快速启动mysql服务的,启动时候绑定主机上的3306端口,查找mysql容器的ip,使用mysql -h containerIP 或者127.0.0.1就可以直接访问mysql服务,暂不考虑mysql的存储卷。    

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包