Docker 基本操作
Docker 基本操作
Docker简介
Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)更重要的是容器性能开销极低。
Docker支持将软件编译成镜像;在镜像中支持各种软件配置好并发布,其他使用者可以直接使用配置好的镜像。运行中的镜像称之为容器,容器启动速度很快。类似于封装好的Windows系统,通过U盘直接安装即可,不需要进行系统配置软件
Docker的应用场景:
- Web应用的自动化打包发布;
- 自动化测试和持续集成、发布;
- 在服务型环境中部署调整数据库或其他的后台应用;
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker的优点:
- 快速、一致性的交付应用程序
- 响应式部署和扩展
- 充分利用虚拟机资源
Docker核心概念
Docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统中)
Docker客户端(Client):连接Docker主机进行操作;
Docker容器(Container):镜像启动后的实例,独立运行的一个或一组应用;
Docker镜像(Image):打包好的软件,用于创建Docker容器的模板;
Docker仓库(Respository):用于保存打包好的软件镜像;
关系示意图:
Docker的基本使用方式:
- ① 在机器中安装Docker;
- ② 在Docker仓库中寻找这个软件对应的镜像;
- ③ 使用Docker运行镜像,生成一个Docker容器;
- ④ 容器的启动或停止相当于对软件的启动和停止;
Docker的搭建
Docker版本要求
1、要求 CentOs7 系统的内核版本高于 3.10,可通过如下指令查看版本
uname -r
更新yum
安装docker ce即社区免费版,先安装必要的软件包,安装yum-utils,它提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2用于储存设备映射(devicemapper)必须的两个软件包。
sudo yum update
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
紧接着配置一个稳定(stable)的仓库 ,仓库配置会保存到/etc/yum.repos.d/docker-ce.repo文件中。此处我们使用阿里云。
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新Yum安装的相关Docke软件包
sudo yum makecache fast#会出错
出现如下错误:
yum makecache: error: argument timer: invalid choice: ‘fast’ (choose from ‘timer’)
更新索引的时候出错,即centos8没有该参数,解决办法为:去掉fast参数
查看仓库版本,并指定版本安装
查看版本
yum list docker-ce --showduplicates | sort -r
安装
yum install -y docker-ce docker-ce-cli
卸载:
yum list installed | grep docker
yum remove #移除需要卸载的组件
出现如下错误: Problem: package docker-ce-3:18.09.9-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
根据提示,需要containerd.io的版本 >= 1.2.2-3,操作如下
也有可能出现此错误
解决方式yum erase podman buildah
(1)安装wget指令
yum install wget
(2)获取rpm包
wget http://docker-release-purple-prod.s3-website-us-east-1.amazonaws.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
(3)升级containerd.io(安装rpm包)
yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm
(4)重新安装docker-ce
yum install docker-ce
Doker info命令出现的问题:
执行docker info出现如下警告
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解决办法:
vi /etc/sysctl.conf
添加以下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
最后再执行
sysctl -p
=------------------------------------------------
docker not found
export DOCKER_PATH="/Applications/Docker.app/Contents/Resources/bin"
export PATH=".\$PATH:$DOCKER_PATH"
启动docker
(1)设置开机自启动
sudo systemctl start docker
sudo systemctl enable docker
(2)启动
sudo systemctl start docker
(3)验证
docker version
说明安装成功
或者
sudo docker ps
说明安装成功
(4)查看docker运行状态
systemctl status docker
删除docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
rm -rf /var/run/docker
Docker常用的命令
拉取镜像
docker pull busybox
拉取镜像慢,配置加载镜像地址
vi /etc/docker/daemon.json
# 内容=======================
“registry-mirrors”: [
“https://ebkn7ykm.mirror.aliyuncs.com",
”https://docker.mirrors.ustc.edu.cn“,
”http://f1361db2.m.daocloud.io“,
”https://registry.docker-cn.com"
]
# =============================
首次启动镜像
docker run -d --name busybox-first busybox
-d 代表后台运行容器
docker run -it --name busybox-test busybox sh
参数说明:
- -i: 交互式操作。
- -t: 终端。
- -p:端口。
- -ip:指定IP。
- -v:数据卷。例如:-v /data:/data:ro。ro为容器只读。
- –volumes-from:数据卷来自于已有的容器。
- -name:容器名。
- busybox 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
启动已存在容器
docker start <容器 ID/Name>
docker restart 容器id1 [容器id2] [...] #重启
运行的docker容器列表
docker ps # 查看正在运行的容器列表
docker ps –a # 所有容器列表(包含存活和退出容器)
停止容器
docker stop <容器 ID/Name>
进入容器
docker exec -it 容器ID/容器别名称 /bin/bash
从这个容器退出,不会导致容器的停止,推荐大家使用
查看容器的某些进程PID
doker top name
删除容器
docker rm name
镜像列表
docker images
启动所有容器
docker start $(docker ps -a -q)
复制文件到容器
docker cp sentinel.conf redis-master:/usr/local/redis
创建容器时指定IP
Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定。
在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的。
我们可以创建自己的bridge网络 : mynet,创建容器的时候指定网络为mynet并指定ip即可。
查看网络模式
docker network ls
创建一个新的bridge网络
docker network create --driver bridge --subnet=172.19.0.0/16 --gateway=172.19.0.1 dockercompose
查看网络信息
docker network inspect dockercompose
创建容器并指定容器ip
docker run -it --name nginx-second --network=dockercompose --ip 172.19.0.6 nginx
# 验证是否固定
docker insepect 容器ID | grep "IpAddress"
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.19.0.6",
创建快照
查看现有容器
docker ps/docker ps -a
###创建容器快照
docker export ID > test.tar
导入并验证
cat dd.tar | docker import - test1:latest
docker run -it ID(镜像) /bin/bash
---------------- 运行报错 ------------------
docker run 有问题
查看数据卷相关信息
docker inspect -f {{.Volumes}} 容器名
构建容器(nginx为例)
拉取镜像
docker pull centos
启动镜像
docker run --name nginx-man -it centos
安装相关依赖包
yum install -y wget gcc gcc-c++ make openssl-devel
安装nginx依赖
wget http://nginx.org/download/nginx-1.9.3.tar.gz
mv nginx-1.9.3.tar.gz /usr/local/data/nginx-1.9.3.tar.gz
cd /usr/local/data
解压
tar -zxf nginx-1.9.3.tar.gz
创建www用户
useradd -s /sbin/nologin -M www
启动nginx
./configure --prefix=/usr/local/data/nginx --user=www --group=www --with-http_ssl_moudle --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.37
make
make
make install
配置启动容器直接运行nginx
vi /usr/local/data/nginx/conf/nginx.conf
#添加,让其在前台运行
daemon off;
验证
exit#退出容器
docker commit -m "my nginx" 容器ID my-nginx1:vl
doker images
#发现已经有了新镜像
docker run -it -p 92:80 my-nginx1:v1 /usr/local/data/nginx/sbin/nginx
#可以循环添加想要的容器数量
在浏览器打开IP:92
可以看到nginx
容器自启
docker container update --restart=always 容器名
附录:
Gitlab安装
docker pull twang2218/gitlab-ce-zh
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh' #gitlab镜像
restart: always
privileged: true #权限
hostname: '192.168.3.249' #主机名,即虚拟机的ip
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.3.249' #主机名,即虚拟机的ip
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8084
ports:
- '8084:8084'
- '8443:443'
- '2222:22'
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'