学习笔记--Docker

环境:redhat7.2

安装包:

docker-engine-selinux-1.10.3-1.el7.centos.noarch

docker-engine-1.10.3-1.el7.centos.x86_64

开启服务:docker

docker version 查看docker版本

docker load -i rhel7.tar  倒入镜像

ctrl + p q 不中断退出

ctrl+d   退出并中断

docker ps -a  列出所有容器

docker run  -it --name vm1 ubuntu bash打开交互式

docker stop vm1     docker start vm1    docker rm vm1

docker  start/stop/kill/restart containername/id

非交互式在容器中运行命令:

# docker run --rm rhel7 cat /etc/hosts

列出当前正在运行的容器: # docker ps

列出最近一次启动的容器:# docker ps -l

重启停止的容器:

# docker start -ai vm1

Docker start `docker ps -aq`  打开所有容器

docker attach vm1  连接到vm1

docker top vm1查看容器详细参数

docker logs vm1查看对容器的所有操作  logs后加 -f 代表实时监控

docker stats vm1 查看运行状态

docker diff vm1查看对vm1的更改

docker inspect vm1  查看该容器所有信息

docker run -d --name vm1 ubuntu bash -c "while true;do echo wesots;sleept 1;done"打入后台并执行

docker pause/unpause vm1 停止/启动容器

docker run -d --name vm1 -p 8080:80 nginx  后台运行端口为8080的nginx

对镜像的操作

docker  search/pull/push/rmi/save

docker  save ubuntu >  test.tar 镜像的导出

docker  commit vm1 test 保存后提交生成test镜像

docker run -it --name vm4 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro rhel7 bash

容器内挂载物理机上的数据(默认权限为读写,data2赋予权限ro)

docker run -it --name vm1 -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/dvd.repo:ro rhel7 bash   将系统镜像挂载到容器内

docker create --name data -v /tmp/data1:/data1 -v /tmp/data2:/data2 rhel7 bash生成data卷,便于以后使用

docker run --rm --volumes-from data -v /tmp/backup:/backup ubuntu tar cf /backup/test.tar /data2   调用卷组中的data2,并将其中数据打包备份到backup目录下

修改docker网络

systemctl stop docker

ip addr del 172.17.0.1/16 dev docker0

ip addr add 172.17.60.1/24 dev docker0

ip link set dev docker0 up

cp /usr/lib/systemd/system/docker.service /etc/systemd/system/ (会先读取etc下的配置文件,若此处不存在,则会读取usr下的配置文件,**官方推荐:cp /usr/lib/systemd/system/docker.service /etc/systemd/system/)

vim /etc/systemd/system/docker.service

systemctl daemon-reload

systemctl start docker

网络启动的四种方式:

1.不添加参数表示默认模式,桥接在docker0上

2.docker run -it --net=host --name vm2 ubuntu bash (此种模式会造成端口争抢)

3.docker run -it --name vm3 --net=container:vm1 ubuntu bash

4.docker run -it --name vm4 --net=none ubuntu bash

为第四种方式添加ip地址:

sysctl -a | grep ip_forward  查看是否开启,1为开启

启动一个none

docker run -it --name vm1 --net none ubuntu bash

添加连接口

ip link add name veth0 type veth peer name veth1

将接口一端连接至docker0,并激活veth0 1 状态为up

brctl addif docker0 veth0

ip link set dev veth0 up

ip link set dev veth1 up

获取vm1的Pid号

docker inspect -f ‘{{.State.Pid}}‘ vm1

通过获取的进程pid进入目录

cd /proc/9123/ns/

创建链接目录

mkdir -p /var/run/netns/

ln -s /proc/9123/ns/net  /var/run/netns/9123

ip netns list查看9123是否添加成功

将veth1与vm1相连

ip link set veth1 netns 9123

给veth1一个ip地址

ip netns exec 9123 ip addr add 172.17.60.100/24 dev veth1

ip netns exec 9123 ip route add default via 172.17.60.1

加入docker0为网关,ping其他物理主机能否ping通

(重命名:ip netns exec 9123 ip link set veth1 name eth0

ip netns exec 9123 ip link set eth0 up )

容器间的互连:

打开一个redis并打入后台

docker run -d --name redis redis

打开一个redis客户端并连接至别名为db的redis

docker run -it --name redisclient --link redis:db redis bash

redis-cli -h db

config get *

在redhat6上

yum install libcgroup.x86_64 -y

/etc/init.d/cgconfig start

vim /etc/cgconfig.conf

添加:

group x1 {

memory {

##1            memory.limit_in_bytes=209715200;

##2            memory.memsw.limit_in_bytes=209715200;

}

}

##1  限制内存使用为200M(200*1024*1024),若只添加这一行,当超出200M时,多出的内存使用会到swap中

##2  限制swap与内存总和为200M

进入到内存中  /dev/shm

cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300

调用x1 并写入一个300M的文件

[[email protected] shm]# free -m

total       used       free     shared    buffers     cached

Mem:           996        223        772          0         15        141

-/+ buffers/cache:         67        929

Swap:          815          0        815

[[email protected] shm]#  cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300

Killed

[[email protected] shm]# free -m

total       used       free     shared    buffers     cached

Mem:           996        422        573          0         15        339

-/+ buffers/cache:         67        929

Swap:          815          0        815

测试:利用memapp(一个page4kb)将限制控制在4096-8192之间

vim /etc/cgconfig.conf

group x1 {

memory {

memory.limit_in_bytes=18099999;

memory.memsw.limit_in_bytes=18099999;

}

}

退出该目录并/etc/init.d/cgconfig restart

vim /etc/cgrules.conf

yml:memapp1     memory  x1/

yml:memapp2     memory  x1/

为用户添加调用策略

/etc/init.d/cgred  restart

切换到普通用户执行./memapp1  ./memapp2

[[email protected] ~]$ ./memapp1

Process ID is: 6887

Grabbing 4096 pages of memory

Success!

[[email protected] ~]$ ./memapp2

Process ID is: 6888

Grabbing 8192 pages of memory

Killed

控制cpu优先级

vim /etc/cgconfig.conf

group x2 {

cpu  {

cpu.shares=100;

}

}

/etc/init.d/cgconfig restart

为了测试只让一个cpu工作:

cd  /sys/devices/system/cpu/cpu1

echo 0 > online

开启两个占用cpu的进程,一个使用x2策略,另一个不使用

dd if=/dev/zero of=/dev/null &

cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &

top

PID USER     PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

6971 root      20   0  102m  696  576  R  90.9  0.1   0:27.39 dd

6972 root      20   0  102m  696  576  R  9.0   0.1   0:01.36 dd

-f   -r

chrt  -r 1  md5sum  /dev/zero  :轮叫

chrt  -f 1  md5sum  /dev/zero  :抢夺

设置优先级:

renice -n 19 -p 7841(将7841进程优先级改为19)

限制io

yum  install iotop

vim /etc/cgconfig.conf

group x3 {

blkio {

blkio.throttle.read_bps_device="8:0 1024000";##限制读取速度为1000k/s,8:0为设备id,ll /dev/sda查看

}

}

/etc/init.d/cgconfig restart

cgexec -g blkio:x3 dd if=/dev/sda of=/dev/null &

利用iotop工具查看io状况

TID  PRIO  USER     DISK READ  DISK  WRITE  SWAPIN     IO>    COMMAND

7012 be/4    root      890.19 K/s    0.00 B/s  0.00 % 99.22 % dd if=/dev~f=/dev/null

冻住进程:

group x4 {

freezer {

}

}

cd /cgroup/freezer/x4

echo  7064 > tasks

echo  FROZEN > freezer.state   冻住进程,测试的为top的pid

echo  THAWED > freezer.state  解锁进程

安全

设置特权级运行的容器:--privileged=true

有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载

USB 磁盘,修改 MAC 地址等

docker run -it --name vm2 --privileged=true ubuntu bash

设置容器白名单:--cap-add

--privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限

制,只提供给容器必须的权限。此时 Docker 提供了权限白名单的机制,使用--cap-add 添加

必要的权限。

docker run -it --name vm3 --cap-add NET_ADMIN ubuntu bash

mkdir /mnt/test

cd /mnt/test  vim Dockerfile

FROM rhel7:yum  ####修改后commit

MAINTAINER yml

ENV HOSTNAME server1

EXPOSE 80

RUN yum install -y httpd && yum clean all

CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

docker run -it --name vm1 -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/dvd.repo rhel7:yum bash

docker build -t rhel7:apache .

docker run -d --name apache -p 8000:80 -v /mnt/test/index.html:/var/www/html/index.html rhel7:apache

curl 172.25.60.250:8000

FROM jingxiang

MAINTAINER yml

ENV HOSTNAME server2

EXPOSE 22

RUN echo root:wesots | chpasswd

RUN yum install -y openssh-server && yum clean all

RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N ""

RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ecdsa_key -q -N ""

CMD ["/usr/sbin/sshd","-D"]

运行多个应用

vim Dockerfile

FROM jx

MAINTAINER yml

ENV HOSTNAME server3

EXPOSE 22 80

RUN echo root:wesots | chpasswd

RUN yum install -y openssh-server httpd supervisor && yum clean all  ###supervisor安装包须自己下载

RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N ""

RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ecdsa_key -q -N ""

ADD index.html /var/www/html/index.html

COPY supervisord.conf /etc/supervisord.conf

CMD ["/usr/bin/superbisord"]

vim supervisord.conf

[supervisord]

nodaemon=true

[program:sshd]

command=/usr/sbin/sshd -D

[program:httpd]

command=/usr/sbin/httpd -D FOREGROUND

制作本地镜像仓库

vim /etc/systemd/system/docker.service

[Service]

Type=notify

ExecStart=/usr/bin/docker daemon -H fd:// --bip 172.17.60.1/24 --insecure-registry 172.25.254.60:5000

MountFlags=slave

LimitNOFILE=1048576

LimitNPROC=1048576

LimitCORE=infinity

TimeoutStartSec=0

systemctl daemon-reload

systemctl restart docker

docker load -i registry-2.3.1.tar

docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2.3.1

docker tag redis 172.25.254.60:5000/redis:v1

docker push 172.25.254.60:5000/redis           上传

docker pull 172.25.254.60:5000/redis:v1          下载

加密

docker run --entrypoint htpasswd registry:2.3.1 -Bbn yml westos > /opt/auth/htpasswd

docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry -v /opt/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry:2.3.1

docker login 172.25.254.60:5000只有在登陆后才能完成push pull动作

/root/.docker/config.json 证书文件所在位置,删除后须重新认证

时间: 2024-10-23 10:32:45

学习笔记--Docker的相关文章

Docker学习笔记 — Docker命令总结

Docker的操作命令总结如下图. 参考资料: Docker——从入门到实践

Docker学习笔记 — Docker容器

1. 基本概念 Docker利用容器运行应用,容器是从镜像创建的运行实例,每个容器都是相互隔离的. 镜像是只读的,容器在启动的时候在其上创建了一层可读写层. 2. 启动和终止容器 启动一个容器有两种方法,一种是从镜像创建一个容器并运行,另一种是重新启动处于终止状态的容器. 创建并启动 使用docker run命令从镜像创建并启动一个容器. 使用docker run命令创建容器时,后台执行的操作包括: - 检查本地是否存在该镜像,不存在就先从公有仓库下载 - 利用镜像创建并启动一个容器 - 分配一

Docker学习笔记 — Docker镜像

1. 基本概念 Docker镜像可以用来创建Docker容器,为一个只读的模板. Docker运行容器前需要本地存在对应的镜像,如果镜像不在本地,Docker会从镜像仓库下载. 2. 本地镜像 使用docker images显示本地已有镜像. 其中包含了如下信息:仓库,标记,ID,创建时间,大小. 3. 使用镜像启动容器 使用docker run启动一个容器. 在命令中我们也可以只指明ubuntu,这样就默认使用TAG为latest的版本.使用exit退出. 4. 搜索和获取镜像 使用docke

Docker学习笔记——Docker安装部署

1.系统环境 CentOS7.3 Docker需要安装在64为平台上,并且内核版本不能低于3.10 [[email protected] ~]# uname -a Linux web-t 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 2.Docker安装 Docker官方提供了安装脚本,可以直接使用 curl -sSL https://get.docker.com/

Docker学习笔记 — Docker仓库

基本概念 仓库是集中存放镜像的地方. Docker Hub Docker Hub是Docker官方维护的一个公共仓库. 执行docker login命令登录,本地用户目录下的.dockercfg文件中保存了用户的认证信息. 使用docker search命令查找官方仓库中的镜像,使用docker pull命令下载镜像到本地. 私有仓库的搭建 — 使用Docer-registry 通常从官方维护的中央仓库下载镜像会比较慢,或者公司内部想搭建一个私有的仓库以供内部人员使用,此时我们可以使用官方提供的

个人--Docker学习笔记

Docker学习笔记 docker让应用分发,测试,部署变得前所未有的高效和轻松 docker利用率很高,一台主机上可以同时运行数千个docker容器 docker容器除了运行其中应用外,基本不消耗额外的系统资源 docker容器不需要额外的hypervisor支持,是内核级的虚拟化 docker容器几乎可以在任意平台上运行 docker的三个基本概念 镜像(image) 容器(container) 仓库(repository) 以上是docker的整个生命周期 镜像的作用是用来创建容器的.镜像

Docker学习笔记——镜像、容器、仓库

Docker三个基本概念 镜像(image) 容器(container) 仓库(Repository) 镜像(image) 搜索镜像 docker search nginx 获取镜像 docker pull nginx 指定Registry地址和具体的仓库名下载镜像,没有指定Registry地址,默认从Docker Hub上下载 docker pull jwilder/nginx-proxy 查看镜像 docker images  REPOSITORY          TAG         

Docker 学习笔记【1】Docker 相关概念,基本操作

计划:Docker 学习笔记[2] Docker 基础操作实操记录,Docker仓库.数据卷,网络基础学习---40 注:所有操作在root下执行 --1--概念: 1.Docker镜像: 镜像就是一个只读的模板,用于创建docker容器. Docker提供了简单的机制创建或者更新现有镜像,也可以从别处拿来现成镜像直接使用. 2.Docker容器: 可以认为是精简版的linux运行环境包含 [root权限,进程空间,用户空间,网络空间等]和应用程序 另外:镜像是只读的,容器基于镜像启动后创建一层

Docker 学习笔记【2】 Docker 基础操作实,Docker仓库、数据卷,网络基础学习

Docker 学习笔记[3] Docker 仓库实操,创建私有仓库,实操数据卷.数据卷容器,实操 网络基础  ---------高级网络配置和部分实战案例学习 ============================================================= Docker 学习笔记[1]Docker 相关概念,基本操作--------实操记录开始 ============================================================= 被