Docker学习笔记

Docker

1. Docker的核心

在这里插入图片描述

  • 镜像:一个镜像代表一个应用环境,他是一个只读文件,如mysql镜像,nginx镜像等
  • 容器:镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点是可读可写
  • 仓库:用来存放镜像的位置,类似于git仓库,也是镜像下载和上传的地方
  • dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
  • tar:一个对镜像打包的文件,日后可以还原成镜像
2. Docker的安装
  • CentOS 7

    • 安装docker依赖

      $ sudo yum install -y yum-utils
      
    • 设置docker的yum源

      $ sudo yum-config-manager \
          --add-repo \
          https://download.docker.com/linux/centos/docker-ce.repo
      
    • 安装最新版docker

      $ sudo yum install docker-ce docker-ce-cli containerd.io
      
    • 指定版本安装docker

      # 列出所有的版本
      $ yum list docker-ce --showduplicates | sort -r
      
      docker-ce.x86_64  3:18.09.1-3.el7                     docker-ce-stable
      docker-ce.x86_64  3:18.09.0-3.el7                     docker-ce-stable
      docker-ce.x86_64  18.06.1.ce-3.el7                    docker-ce-stable
      docker-ce.x86_64  18.06.0.ce-3.el7                    docker-ce-stable
      
      # 选择要安装的版本
      $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
      # 示例
      $ sudo yum install docker-ce-18.06.0.ce-3.el7  docker-ce-cli-18.06.0.ce-3.el7  containerd.io
      
    • 启动docker

      $ sudo systemcl start docker
      
    • 查看docker状态

      $ sudo systemcl status docker
      
    • 关闭docker

      $ sudo systemcl stop docker
      
    • 测试docker安装

      $ sudo docker run hello-world
      
3. Docker中配置阿里云镜像加速服务
3.1 docker运行流程

在这里插入图片描述

3.2 docker配置阿里云镜像加速
  • 访问阿里云登录自己账号查看docker镜像加速服务

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://sqgidlbo.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  • 验证docker的镜像加速是否生效

    docker info
    
    Insecure Registries:
    127.0.0.0/8
    Registry Mirrors:
    `https://sqgidlbo.mirror.aliyuncs.com/`
    Live Restore Enabled: false
    Product License: Community Engine
    
4. Docker的入门应用
4.1 docker的第一个程序
  • docker run hello-world

    a243525@Romasaver ~ % docker run hello-world
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    
5. 常用命令
5.1 辅助命令
# 查看docker信息
	docker version

# 查看更详细的信息
	docker info

# 帮助命令
	docker --help
5.2 images 镜像命令
# 1.查看本机中所有镜像
	docker images
		-a 列出所有镜像(包含中间映象层)
		-q 只显示镜像id
	
# 2.搜索镜像,去dockerhub上查询
	docker search [options] 镜像名
		-s 指定值,列出收藏数不少于指定值的镜像
		--no-trunc 显示完成的镜像信息

# 3.从仓库下载镜像
	docker pull 镜像名[:TAG|@DIGEST]
	
# 4.删除镜像
	docker rmi 镜像名
		-f 强制删除
5.3 Contrainer 容器命令
5.3.1 基本命令(容器外操作)
# 1.运行容器
	docker run 镜像名
		--name 为容器起别名
		-d 启动守护式容器(后台启动容器)
		-p 映射端口号:原始端口号 指定端口号启动
		-i 以交互模式运行容器,通常与 -t 同时使用;
		-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
	例:
		docker run -it --name myNginx -p 80:80 nginx
		docker run -d --name myNginx -P nginx
		
# 2.查看运行的容器
	docker ps
		-a 正在运行的和历史运行过的容器
		-q 静默模式,只显示容器编号
		
# 3.停止|关闭|重启容器
	# 开启容器
	docker start 容器名字|容器id
	# 重启容器
	docker restart 容器名字|容器id
	# 正常停止容器运行
	docker stop 容器名字|容器id
	# 立即停止容器运行
	docker kill 容器名字|容器id

# 4.删除容器
	# 删除指定容器
	docker rm -f 容器名字|容器id
	# 删除所有容器
	docker rm -f $(docker ps -aq)
	
# 5.查看容器内进程
	docker top 容器名字|容器id
	
# 6.查看容器内部细节
	docker inspect 容器id
	
# 7.查看容器的运行日志
	docker logs [options] 容器名字|容器id
		-t 加入时间戳
		-f 跟随最新的日志打印
		--tail 数字 显示最后多少条
5.3.2 进阶命令(容器内数据交互)
# 1.进入容器内部
	docker exec [options] 容器id 容器内命令
		-i 以交互模式运行容器,通常与-t一起使用
		-t 分配一个伪终端
	# 示例	
  docker exec -it a05 /bin/bash
		
# 2.容器内安装软件
	apt-get update
	apt-get install 安装包名称
	
# 3.修改容器内文件
	echo "I LOVE PYTHON" > /usr/share/nginx/html/index.html
	
# 4.退出容器
	exit

# 5.将容器打包为新镜像
	docker commit -a="作者" -m=”描述信息“ 容器id 目标镜像名称:TAG
	
# 6.从容器中复制文件到宿主机目录中
	docker cp 容器id:容器内资源路径
	
# 7.设置容器和宿主机共享目录
	docker run -it -v /宿主机的路径:/容器内的路径:ro(只读) 镜像名
	示例:docker run -d -p 80:80 -v /Users/a243525/home:/usr/share/nginx/html nginx
	注意:宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容,-v可以加很多次,映射多个目录
	运行docker inspect 容器id 命令,检查json串里有没有以下内容,如果有则说名卷挂载成功
	"Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/a243525/home",
                "Destination": "/usr/share/nginx/html",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
    
# 8.打包镜像
	docker save 镜像名 -o 名称.tar 默认保存到当前路径下
	
# 9.载入镜像
	docker load -i 名称.tar
6. Docker的镜像原理
6.1 镜像是什么?

镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件

6.2 为什么一个镜像会那么大?
  • UnionFS(联合文件系统)
    • Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同事可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这种最终的文件系统会包含所有底层的文件和目录。
6.3 Docker镜像原理

docker的镜像实际是由一层一层的文件系统组成。

  • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix系统是一样的,包含boot加载器(BootLoader)和内核(kernel)。当boot加载完后,整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
  • rootfs(root file system),在bootfs之上,包含的就是典型的Linux系统中的/dev、/proc、/bin、/etc等标准的文件和目录。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
  • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用宿主机Host的Kernel,自己只需要提供rootfs就行了。由此可见不同的Linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
6.4 为什么docker镜像要采用这种分层结构?

最大的一个好处就是资源共享

  • 比如:有多个镜像都是从相同的base镜像构建而来,那么宿主机只需要在磁盘保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层,容器层之下都叫镜像层。
7. Docker安装常用服务
7.1 安装mysql

正常情况下都是直接使用第六条命令

# 1.拉取mysql镜像到本地
	docker pull mysql:tag(tag不加默认最新版本)
	
# 2.运行mysql服务
	# 没有暴露外部端口,外部能连接
	docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -d mysql:tag
  # 暴露外部端口,外部科技连接,指定mysql版本
	docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql:5.7

# 3.进入mysql容器
	docker exec -it 容器名称|容器id bash
	
# 4.外部查看mysql日志
	docker logs 容器名称|容器id
	
# 5.使用自定义mysql配置参数
	docker run --name devmysql -v /Users/huang/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -d mysql:tag
	
# 6.将容器数据位置与宿主机位置挂载保证数据同步
	docker run --name devmysql -v /User/huang/mysql/conf.d:/etc/mysql/conf.d -v /User/huang/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -d mysql:tag
	
# 7.通过其他客户端访问,Navicat Premium

# 8.将mysql数据库备份为sql文件
	# 导出全部数据
	docker exec mysql容器名称|mysql容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /Users/huang/all-databases.sql
	# 导出指定库的数据
	docker exec mysql容器名称|mysql容器id sh -c 'exec mysqldump --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /User/huang/表名.sql
	# 导出指定库信息,不要数据
	docker exec mysql容器名称|mysql容器id sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /User/huang/表名.sql
	
# 9.执行sql文件到mysql中
	docker exec -i mysql容器名称|mysql容器id sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" < /Users/huang/xxx.sql'
7.2 安装redis
# 1.在docker hub搜索redis镜像
	docker search redis

# 2.拉取redis镜像到本地
	docker pull redis:tag

# 3.运行容器启动redis服务
	docker run --name redis -p 6379:6379 -d redis:tag
	
# 4.查看启动日志
	docker logs -t -f redis
	
# 5.进入容器内部查看
	docker exec -it redis bash
	
# 6.加载外部自定义配置启动redis容器
	默认情况下redis官方镜像中没有redis.conf配置文件,需要去官网下载指定版本的配置文件
	1. wget http://download.redis.io/releases/redis-5.0.8.tar.gz 下载官方包
	2. 将官方安装包中配置文件进行复制到宿主机指定目录中,如/Users/huang/redis/redis.conf
	3. 修改需要自定义的配置
		bind 0.0.0.0 开启远程连接
		appenonly yes 开启aof持久化
	4. 加载配置启动
		docker run --name redis -v /Users/huang/redis/redis:/usr/local/etc/redis/redis -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf
		
# 7.将容器数据位置与宿主机位置挂载保证数据同步
	docker run --name redis -v /Users/huang/redis/data:/data -v /Users/huang/redis/redis:/usr/local/etc/redis/redis -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值