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

news2024/12/23 8:46:41

文章目录

  • docker简介
  • ubuntu下安装docker
  • kali下安装docker
  • docker基本命令
  • docker搭建mysql、nginx、redis
  • 容器/镜像打包
  • 搭建私有镜像仓库
  • docker网络管理
  • Dockerfile文件
  • docker-compose.yml
    • 示例:搭建lamp

docker简介

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

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

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

docker和虚拟机的区别

简单来说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查看此容器的一些配置信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件著作权登记版权保护中心下发补正修改指南

本文为大家介绍常见版权中心下发的补正问题及对应修改方法。 一、补正是什么意思&#xff1f; 补正&#xff0c;即增补订正。 下发补正指版权保护中心发现软件著作权登记材料中存在一些格式/内容上的问题&#xff0c;予以驳回。要求著作权人或代理人依照补正意见内容对材料进…

电影《灌篮高手》观后

上周和同学一起看了电影《灌篮高手》这部电影&#xff0c;个人以前没有看过相关漫画和动画&#xff0c;但记得&#xff0c;看过海报和一些宣传物品&#xff0c;有的衣服上&#xff0c;有文具盒上&#xff0c;也都出现过&#xff0c;而且是在自己小时候&#xff0c;可见当时的影…

(中)苹果有开源,但又怎样呢?

上篇&#xff08;详情请戳&#xff1a;《&#xff08;上&#xff09;苹果有开源&#xff0c;但又怎样呢&#xff1f; 》&#xff09;里说到&#xff0c;苹果首个开源项目 Darwin 的诞生&#xff0c;与乔布斯的复仇归来有着千丝万缕的关系。 作为一个开源的操作系统&#xff0c…

【JAVA】将两个字符串相乘并返回字符串

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : Java &#x1f606;今日分享 : 越忙越不能熬夜. —晚安 , 好梦. 将两个字符串相乘并返回字符串 &#x1f33b;前言:✔题目:&#x1f50e;代码详情:1.创建字符创对象:2.将字符串转化为数字:3.数字相乘,并转化为字符串家人们,点…

[C++]——C++基础知识点(C++和C语言的区别)

文章目录 1. 前言2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C的输入输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理——名字修饰 6. 引用6.1 引用概念6.2 引用特性6.3 常引用6.4 引用的使用场景6.5 引用和指针的…

招商基金数字化转型下的研发管理|ONES 客户案例

在 4 月 20 日举行的《中国企业软件研发管理白皮书》发布会上&#xff0c;招商基金信息技术部副总监、研发中心主管刘志昆作了《招商基金数字化转型下的研发管理》主题演讲&#xff0c;从数字化转型背景、研发管理所遇到的挑战出发&#xff0c;讲述招商基金如何摸索出适合自身环…

Pycharm连接MySQL

使用MySQL内置工具&#xff08;命令&#xff09; 创建数据库&#xff1a;unicom 数据表&#xff1a;admin 表名&#xff1a;admin 列&#xff1a;id 整型 自增 主键username 字符串 不为空&#xff0c;password 字符串 不为空&#xff0c;mobile 字符串 不为空 Python代码实…

echarts 象形柱图_矢量图_自定义样式

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、象形柱图二、环形图…

电脑中了勒索病毒,Windows操作系统如何设置才能预防faust勒索病毒攻击?

随着计算机技术的不断发展&#xff0c;勒索病毒的加密程序也有了很大提升&#xff0c;phobos勒索家族也衍生出了各种后缀的勒索病毒&#xff0c;给我们的日常工作生活带来了很大困扰。随着phobos勒索家族的加密程序升级&#xff0c;faust勒索病毒已经成为该家族中较为疯狂的勒索…

BACnet IP通讯方式组网步骤

BACnet IP通讯方式组网步骤 文章目录 BACnet IP通讯方式组网步骤前言一、配置BACnet IP网络参数二、确定DDC控制器和扩展模块的BACnet地址三、配置BACnet对象&#xff1a;四、配置DDC控制器和扩展模块五、测试通信六、实现控制功能七、总结 前言 BACnet IP方式组网的几个优势&…

强烈建议互联网人转战实体和农业,去了就是降维打击!实体太缺人才了,老板也不缺钱!...

大环境不好&#xff0c;互联网人该何去何从&#xff1f; 一位网友提出了一个新思路&#xff1a;强烈建议互联网同学转战实体、农业这些行业。实体真的太缺人才了&#xff0c;目前大部分实体都留下70后、80后在继续奋斗。其实实体老板很多都不缺钱&#xff0c;经过多年积累&…

内外部函数和内存模型

1、函数&#xff08;封装、复用&#xff09; 功能性&#xff1a;最基本的特性&#xff1b; 扩展性&#xff1a;对于时刻变化的需求易于扩展&#xff1b; 维护性&#xff1a;对于时刻变化的需求易于维护&#xff0c;易于编码变更&#xff1b; 封装性&#xff1a;不要把所有的代…

sql优化慢查询

1.慢查询设置 慢查询设置&#xff08;临时&#xff09; -- 查看是否开启了慢查询日志 show variables like slow%;-- 开启慢查询日志 set global slow_query_log on;-- 更改日志路径 set global slow_query_log_file /data/mydata/app1-slow.log;-- 查看慢查询时间临界值&…

学习笔记-主成分分析法

定义 主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;其能反映出原始数据的大部分信息。一般来说&#xff0c;当研究的问题涉及到多变量且变量之间存…

synchronize锁详解

目录 1、什么是synchronize&#xff1f; 2、为什么要用synchronize锁&#xff1f; 2.1 代码演示 2.2 原因分析 2.3 专有名词解释 2.3.1 临界资源 2.3.2 临界区 2.3.3 竞态条件 3、synchronize锁的原理 3.1 锁升级过程 3.1.1 偏向锁 3.1.2 轻量级锁 3.1.3 重量级锁…

【设计模式】七大设计原则--------单一职责原则

文章目录 1.案例1.1 原始案例1.2 改进一&#xff1a;类上遵循单一职责原则1.3 改进二&#xff1a;方法上遵循单一职责原则 2.小结 1.案例 1.1 原始案例 package com.sdnu.principle.singleresponsibility; //客户端 public class singleResponsibility {public static void m…

选择什么电容笔比较好?平价好用的iPad电容笔推荐

科学技术的迅速发展使人们的生活发生了巨大的变化。如今&#xff0c;众多的电子和数码产品层出不穷&#xff0c;而这种能够与平板电脑配套的电容笔也是如此。随着电容笔的不断发展&#xff0c;其应用范围也将不断扩大&#xff0c;今天&#xff0c;我将向大家推荐一些具有较高性…

总结:一文搞懂chatGPT原理

目前关于chatGPT的资料过于零散&#xff0c;没有详尽所有知识点、系统概述的文章&#xff0c;因此&#xff0c;笔者作了这篇总结性文章。 训练过程总览 理清演化路径 预训练(pretrain) GPT-3概述 GPT 3模型的理念 GPT-3如何学习 数据集 指令微调 (Instruction Fine-Tunin…

八大排序之交换排序与计数排序

此篇更新完成后&#xff0c;八大排序已经全部写完&#xff0c;还请各位可以多多支持&#xff01;&#x1f970; 八大排序之选择排序_冷兮雪的博客-CSDN博客 八大排序之插入排序和归并排序_冷兮雪的博客-CSDN博客 目录 交换排序的基本思想&#x1f36d; 一、冒泡排序&#x1f…

JS文件断点续传的切割与合并

总结一下大文件分片上传和断点续传的问题。因为文件过大&#xff08;比如1G以上&#xff09;&#xff0c;必须要考虑上传过程网络中断的情况。http的网络请求中本身就已经具备了分片上传功能&#xff0c;当传输的文件比较大时&#xff0c;http协议自动会将文件切片&#xff08;…