docker容器
- 容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等
(1)与宿主机使用同一个内核,性能损耗小;
(2)不需要指令级模拟;
(3)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
(4)避免了准虚拟化和系统调用替换中的复杂性;
(5)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
-
centos7.6
-
10.0.0.202
-
purple
-
docker的主要组成部分
docker是传统的CS架构分为docker client和docker server,向mysql一样
命令:docker version
[root@controller ~]# docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:10:14 2017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:12:46 2017
OS/Arch: linux/amd64
Experimental: false
docker info(如果要做监控)
docker主要组件有:镜像、容器、仓库, 网络,存储
启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库
安装
-
安装源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
-
换源之后可直接yum安装
[root@purple ~]# yum install -y docker [root@purple ~]# systemctl start docker.service [root@purple ~]# systemctl enable docker.service
- 启动第一个容器前需要配置docker镜像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@purple ~]# systemctl restart docker.service
镜像
-
创建容器需要有依赖容器运行的镜像
-
获取镜像的方式有两种
-
一种是手动上传镜像
-
-
使用rz直接将镜像上传到 /var/lib/docker/containers/ 目录下
此时使用查看镜像列表命令 [root@purple /var/lib/docker/containers]# docker images #列出镜像或者docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE 显示没有镜像 我们使用导入镜像命令导入镜像 docker load [root@purple /var/lib/docker/containers]# docker load -i centos6.9 b5e11aae8a8e: Loading layer 202.9 MB/202.9 MB Loaded image: centos:6.9 [root@purple /var/lib/docker/containers]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 6.9 adf829198a7f 15 months ago 195 MB 此时就发现了可用于创建容器的镜像
-
-
一种 是直接在网上拉取
使用命令 docker search 查找网上的可用镜像
[root@purple /var/lib/docker/containers]# docker search centos
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/centos The official build of CentOS. 5684 [OK]
docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 125 [OK]
[root@purple /var/lib/docker/containers]# docker search niginx
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/28may1988/niginx-demo 0
docker.io docker.io/316213788/niginx qqqqq 0
之后使用docker pull (选中的镜像名称) 将网上镜像下载到本地
[root@purple /var/lib/docker/containers]# docker pull docker.io/ansible/centos7-ansible
Using default tag: latest
Trying to pull repository docker.io/ansible/centos7-ansible ...
latest: Pulling from docker.io/ansible/centos7-ansible
45a2e645736c: Pull complete
1c3acf573616: Pull complete
edcb61e55ccc: Pull complete
cbae31bad30a: Pull complete
aacbdb1e2a62: Pull complete
fdeea4fb835c: Pull complete
Digest: sha256:39eff7d56b96530d014083cd343f7314c23acbd1ecf37eb75a71a2f6584d0b02
Status: Downloaded newer image for docker.io/ansible/centos7-ansible:latest
[root@purple /var/lib/docker/containers]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 6.9 adf829198a7f 15 months ago 195 MB
docker.io/ansible/centos7-ansible latest 688353a31fde 2 years ago 447 MB
--补充
删除镜像
docker rmi (要删除的镜像名称)
[root@purple /var/lib/docker/containers]# docker rmi docker.io/ansible/centos7-ansible
[root@purple /var/lib/docker/containers]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 6.9 adf829198a7f 15 months ago 195 M
容器
[root@purple /var/lib/docker/containers]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 6.9 adf829198a7f 15 months ago 195 MB
[root@purple /var/lib/docker/containers]# docker run -d -p 80:80 centos:6.9
90c41f4e28b1b332aa4d533b99d2724d3ac0f7098a24a262240e035172faec5f
- 参数
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
centos:6.9 docker镜像的名字
[root@purple /var/lib/docker/containers]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@purple /var/lib/docker/containers]# docker ps -all #查看所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90c41f4e28b1 centos:6.9 "/bin/bash" About a minute ago Exited (0) About a minute ago condescending_aryabhata
通过上述查看容器的命令我们发现容器创建成功了,但是并没有运行
[root@purple /var/lib/docker/containers]# docker start 90c41f4e28b1 #启动容器
90c41f4e28b1
[root@purple /var/lib/docker/containers]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
通过启动,我们发现容器可以成功启动,但是启动的瞬间就自动停止运行了,这是因为我们创建容器时却是让容器运行下去的解释器,所以我们需要删除容器并添加解释器创建
删除容器
[root@purple /var/lib/docker/containers]# docker rm 90c41f4e28b1
- 批量删除容器
docker rm -f `docker ps -a -q`
[root@purple /var/lib/docker/containers]# docker run -it -p 80:80 --name nginx centos:6.9 /bin/bash
[root@a689cdcd8ea4 /]#
--参数
-it 分配交互式的终端
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
创建容器之后会直接进入容器内部
[root@a689cdcd8ea4 /]# exit # 退出容器
[root@purple /var/lib/docker/containers]# docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a689cdcd8ea4 centos:6.9 "/bin/bash" About a minute ago Exited (130) 20 seconds ago nginx
此时发现推出容器之后,容器会立刻停止运行,此时将容器启动就可以使容器运行下去了
[root@purple /var/lib/docker/containers]# docker start a689cdcd8ea4
停止容器
docker stop a689cdcd8ea4
杀死容器
docker kill a689cdcd8ea4
进入容器
docker exec -it a689cdcd8ea4 /bin/bash
- 如果你的镜像是centos7.0以上版本,在容器中使用systemctl的命令时会报错,此时你需要使用以下命令创建容器才能在容器中正常使用systemctl命令
docker run --privileged -d -ti -e "container=docker" -v /sys/fs/cgroup:/sys/fs/cgroup centos7 /usr/sbin/init
仓库
- Docker Registry就是完成搭建本地容器仓库,简单来说就是讲一个专门的服务器作为镜像仓库,启用一个Docker Registry容器实例提供服务。
[root@purple /var/lib/docker/containers]# docker pull docker.io/registry
[root@purple /var/lib/docker/containers]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry docker.io/registry:latest
1e1e60dd80f9f934e51b868eb70d856a93b1e79920c18d5020b7947970225701
接下来我们需要通过http://10.0.0.202:5000/v2来判断registry服务是否正常启动,如果出现“{}”既可以说明服务运行正常。
上传镜像到私有仓库:
a:给镜像打标签
[root@purple /var/lib/docker/containers]# docker tag centos:6.9 10.0.0.202:5000/centos:v1
b:上传镜像
[root@purple /var/lib/docker/containers]# docker push 10.0.0.202:5000/centos:v1
如果遇到报错:
The push refers to repository [10.0.0.11:5000/centos6.9_ssh]
Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
解决方法:
vim /etc/docker/daemon.json
{
"insecure-registries": ["10.0.0.202:5000"]
}
systemctl restart docker
[root@purple /var/lib/docker/containers]# docker push 10.0.0.202:5000/centos:v1
The push refers to a repository [10.0.0.202:5000/centos]
b5e11aae8a8e: Layer already exists
v1: digest: sha256:0e59afcc4d7a07fcbd6285f79f6f377ce997ae091c10f8e3c2feb2bcda90b06c size: 529
- 优化本地仓库图形界面
[root@purple /var/lib/docker/containers]# docker pull konradkleine/docker-registry-frontend:v2
[root@purple /var/lib/docker/containers]# systemctl daemon-reload
[root@purple /var/lib/docker/containers]# docker run -d -e ENV_DOCKER_REGISTRY_HOST=10.0.0.202 -e ENV_DOCKER_REGISTRY_PORT=5000 -p 8081:80 konradkleine/docker-registry-frontend:v2
访问浏览器http://10.0.0.202:8081/home 查看上传到仓库的镜像
http://10.0.0.202:8081/repositories/20
扩展
清除仓库
1)进入docker registry的容器中
docker exec -it registry /bin/sh
2)删除/var/lib/registry/docker/registry/v2/repositories目录下的镜像
rm -fr /var/lib/registry/docker/registry/v2/repositories/centos
带basic认证的加密仓库
[root@purple ~]# yum install httpd-tools -y
[root@purple ~]# yum install -y python2-pip
[root@purple ~]# mkdir /opt/registry-var/auth/ -p
[root@purple ~]# htpasswd -Bbn admin 123456 >> /opt/registry-var/auth/htpasswd
[root@purple ~]# docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" docker.io/registry
访问浏览器http://10.0.0.202:5000/v2/可以看到需要刷入密码
用户:admin
密码:123456
--------------purple---------------------