Bagaimana cara mengubah direktori instalasi gambar buruh pelabuhan?

183

Dari apa yang saya tahu, gambar buruh pelabuhan diinstal ke /var/lib/dockersaat mereka ditarik. Apakah ada cara untuk mengubah lokasi ini, seperti volume yang dipasang seperti /mnt?

Michael Barton
sumber
3
sistem operasi mana yang digunakan oleh buruh pelabuhan Anda?
Thomasleveil

Jawaban:

135

Dengan versi Docker terbaru, Anda akan menetapkan nilai data-rootparameter ke jalur kustom Anda, di /etc/docker/daemon.json (sesuai dengan https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file ).

Dengan versi yang lebih lama, Anda dapat mengubah direktori basis penyimpanan Docker (tempat penampung dan gambar) menggunakan -gopsi saat memulai daemon Docker. (periksa docker --help). Anda dapat memiliki pengaturan ini diterapkan secara otomatis ketika Docker mulai dengan menambahkannya ke / etc / default / docker

mbarthelemy
sumber
4
Saya pikir solusi terbaik adalah menambahkan -gopsi ini ke / etc / defaults / docker daripada memodifikasi file Upstart, lihat jawaban saya.
mbarthelemy
9
Ya, ubah baris ini keDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy
6
Tidak berfungsi di Fedora. Lihat jawaban saya jika distro Anda adalah Fedora
Vitor
3
Anda mungkin perlu mengimplementasikan solusi ini ke bug di beberapa versi Debian atau Ubuntu jika buruh pelabuhan mengabaikan /etc/default/dockerfile Anda .
nedim
4
The graphatribut dalam daemon.json sudah ditinggalkan pada v17.05.0, menggunakan data-rootgantinya, lih stackoverflow.com/a/50217666/743507
dschulten
141

Mengikuti saran dari komentar saya menggunakan dokumentasi Docker systemd untuk meningkatkan jawaban ini. Prosedur di bawah ini tidak memerlukan reboot dan jauh lebih bersih.

Pertama-tama buat direktori dan file untuk konfigurasi khusus:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf

Untuk versi buruh pelabuhan sebelum 17.06-ce tempel:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"

Untuk buruh pelabuhan setelah 17.06-ce tempel:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root="/mnt"

Metode alternatif melalui daemon.json

Saya baru-baru ini mencoba prosedur di atas dengan 17.09-ce pada Fedora 25 dan sepertinya tidak berhasil. Alih-alih modifikasi sederhana dalam /etc/docker/daemon.jsonmelakukan trik:

{
    "graph": "/mnt",
    "storage-driver": "overlay"
}

Meskipun demikian Anda harus memuat ulang konfigurasi dan memulai kembali Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Untuk mengonfirmasi bahwa Docker telah dikonfigurasi ulang:

docker info|grep "loop file"

Dalam versi terbaru (17.03) diperlukan perintah yang berbeda:

docker info|grep "Docker Root Dir"

Output akan terlihat seperti ini:

 Data loop file: /mnt/devicemapper/devicemapper/data
 Metadata loop file: /mnt/devicemapper/devicemapper/metadata

Atau:

 Docker Root Dir: /mnt

Maka Anda dapat dengan aman menghapus penyimpanan Docker lama:

rm -rf /var/lib/docker
Piotr Król
sumber
8
Ini hanya metode yang membantu saya di Ubuntu 16.04!
Vadim
1
Tautan ini docs.docker.com/engine/admin/systemd menjelaskan cara mengkonfigurasi Docker dengan systemd, yang berfungsi untuk distribusi linux yang lebih baru seperti Ubuntu 16.04.
Joseph Hui
6
The docker infoPernyataan mungkin usang. Di Ubuntu 16.04, pemeriksaan untuk konfigurasi ulang adalah sudo docker info | grep "Docker Root Dir". Kalau tidak, jawaban yang baik, harus yang diterima;)
Guillaume Perrot
5
Dalam versi baru Linux (4.10) dan Docker (docker-ce 17.06) baris harus diubah sebagai berikut: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini
2
Jika Anda melihat Docker Root Dir: /"/mnt"ketika Anda menjalankan docker info|grep "Docker Root Dir", Anda harus mengganti --data-root="/mnt"ke --data-root=/mntdalam filedocker-storage.conf
Ser
62

Untuk versi buruh pelabuhan yang baru kita perlu menggunakan data-rootseperti yang graphsudah usang di v17.05.0: dokumen yang sudah tidak digunakan lagi

Edit /etc/docker/daemon.json(jika tidak ada, buat) dan sertakan:

{
  "data-root": "/new/path/to/docker-data"
}

Kemudian restart Docker dengan:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Penjelasan langkah-demi-langkah yang lebih rinci (termasuk memindahkan data) menggunakan Docker Storage dengan data-root dapat ditemukan di: Posting blog
  • Dalam kasus Windows posting serupa Windows spesifik
andreas-supersmart
sumber
komentar Anda membantu saya menemukan halaman ini: adriel.co.nz/blog/2018/01/25/… terima kasih!
nasatome
8
Saya pikir sudah waktunya untuk memberikan jawaban ini bendera "diterima", karena ini berfungsi dalam versi saat ini.
The Bndr
Saya berkomentar di sini untuk memberi tahu orang-orang versi mana yang bisa menggunakan ini, setelah github.com/docker/docker.github.io/pull/5978 rilis, Ini mengubah situs web officail.
zhongjiajie
Ini juga bekerja untuk saya, Terima kasih :)
Aashay Amballi
39

Karena saya belum menemukan instruksi yang benar untuk melakukan ini di Fedora (EDIT: orang menunjuk komentar bahwa ini juga harus bekerja pada CentOS dan Suse) (/ etc / default / docker tidak digunakan di sana), saya menambahkan jawab di sini:

Anda harus mengedit / etc / sysconfig / docker , dan menambahkan opsi -g di variabel OPTIONS. Jika ada lebih dari satu opsi, pastikan Anda menyertakannya di "". Dalam kasus saya, file itu berisi:

OPTIONS=--selinux-enabled

jadi itu akan menjadi

OPTIONS="--selinux-enabled -g /mnt"

Setelah restart ( systemctl restart docker), Docker harus menggunakan direktori baru

Vitor
sumber
Pada CentOS 6.5 / 6.6 dan mungkin 7, Anda menggunakan file / etc / sysconfig / docker yang sama, tetapi Anda menambahkan argumen ke nama variabel other_args.
dlaidlaw
Opsi ini disebut DOCKER_OPTS sekarang (versi buruh pelabuhan 1.7.0).
nedim
6
Dari versi 1.8 dan seterusnya Docker, menggunakan file konfigurasi Docker di / etc / sysconfig sudah tidak digunakan lagi. Sebagai gantinya, Anda harus menggunakan file konfigurasi drop-in systemd di etc / systemd / system / docker.service.d. Setelah menambahkan atau memodifikasi file drop-in saat layanan buruh pelabuhan sedang berjalan, jalankan perintah systemctl daemon-reload untuk memberi tahu systemd untuk memuat kembali konfigurasi untuk layanan. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia
dan gunakan file drop-in docs.docker.com/engine/articles/systemd/…
Pablo Marin-Garcia
23

Jangan gunakan tautan simbolis untuk memindahkan folder buruh pelabuhan ke / mnt (misalnya). Ini dapat menyebabkan masalah dengan perintah docker rm .

Lebih baik gunakan Opsi -g untuk buruh pelabuhan. Di Ubuntu Anda dapat mengaturnya secara permanen di /etc/default/docker.io. Tingkatkan atau ganti Baris DOCKER_OPTS.

Berikut sebuah contoh: `DOCKER_OPTS =" - g / mnt / di suatu tempat / yang lain / buruh pelabuhan / "

suther
sumber
dalam kasus saya, saya harus me
psychok7
1
Masalah apa yang harus saya hadapi docker rmketika menggunakan symlink?
bjhend
1
Saya juga harus melakukan ini di Ubuntu 16.04 stackoverflow.com/a/30219552/977622 agar bisa berfungsi
psychok7
21

Cara yang lebih mudah untuk melakukannya:

Hentikan layanan buruh pelabuhan

sudo systemctl stop docker

Pindahkan direktori buruh pelabuhan yang ada ke lokasi baru

sudo mv /var/lib/docker/ /path/to/new/docker/

Buat tautan simbolis

sudo ln -s /path/to/new/docker/ /var/lib/docker

Mulai layanan buruh pelabuhan

sudo systemctl start docker
fnjn
sumber
2
Ini adalah IMO solusi yang tepat dan paling mudah - bekerja untuk saya.
Martin Dvorak
2
bekerja seperti pesona bagi saya tetapi tanpa garis miring untuk perintah tautan simbolis:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio
Inilah yang disarankan oleh forum buruh pelabuhan: forums.docker.com/t/...
headdab
Ini adalah solusi luar biasa yang menyelamatkan hidup saya. :)
Niketh Sudhakaran
Saya sudah mengeksekusi di atas dan buruh pelabuhan itu berdiri dan berjalan. Tetapi saya tidak dapat menemukan gambar buruh pelabuhan saya sudah ada. Ada saran?
Thilina Viraj
13

Solusi ini berfungsi pada Red Hat 7.2 & Docker 1.12.0

Edit file /lib/systemd/system/docker.service di editor teks Anda.

tambahkan -g / path / ke / buruh pelabuhan / di akhir direktif ExecStart . Baris lengkapnya akan terlihat seperti ini.

ExecStart=/usr/bin/dockerd -g /path/to/docker/

Jalankan perintah di bawah ini

systemctl daemon-reload
systemctl restart docker

Jalankan perintah untuk memeriksa direktori buruh pelabuhan

docker info | grep "loop file\|Dir"

Jika Anda memiliki file / etc / sysconfig / docker di Red Hat atau docker 1.7.1 periksa jawaban ini .

Sudeepta
sumber
kasus saya: centos7, buruh pelabuhan terbaru; saya harus memanggil "systemctl status docker" untuk menemukan file "docker.service" dan menambahkan opsi "-g" seperti dalam jawaban. Terima kasih
datdinhquoc
13

Salin dan tempel versi jawaban pemenang :)

Buat file ini hanya dengan konten ini:

$ sudo vi /etc/docker/daemon.json

  {
      "graph": "/my-docker-images"
  }

Diuji di Ubuntu 16.04.2 LTSdalam buruh pelabuhan1.12.6

Topera
sumber
1
The graphatribut dalam daemon.json sudah ditinggalkan pada v17.05.0, menggunakan data-rootgantinya, lih stackoverflow.com/a/50217666/743507
dschulten
12

Dalam CentOS 6.5

service docker stop
mkdir /data/docker  (new directory)
vi /etc/sysconfig/docker

tambahkan baris berikut

other_args=" -g /data/docker -p /var/run/docker.pid"

kemudian simpan file dan mulai buruh pelabuhan lagi

service docker start

dan akan membuat file repositori di /data/docker

sean kim
sumber
6

Untuk Debian / Ubuntu atau Fedora, Anda mungkin dapat menggunakan jawaban lain. Tetapi jika Anda tidak memiliki file di bawah /etc/default/dockeratau /etc/sysconfig/docker, dan sistem Anda menjalankan systemd, Anda mungkin ingin mengikuti jawaban ini oleh h3nrik . Saya menggunakan Arch, dan ini berfungsi untuk saya.

Pada dasarnya, Anda perlu mengkonfigurasi systemd untuk membaca lokasi gambar buruh pelabuhan baru sebagai variabel lingkungan, dan meneruskan variabel lingkungan ke dalam skrip pelaksanaan daemon Docker.

Untuk kelengkapan, berikut adalah jawaban h3nrick:


Apakah Anda memiliki /lib/systemd/system/docker.service file?

Jika demikian, edit sehingga layanan Docker menggunakan yang biasa /etc/default/dockersebagai file lingkungan:EnvironmentFile=-/etc/default/docker .

Dalam /etc/default/dockerfile tersebut lalu tambahkan DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

Pada akhirnya lakukan saja systemctl daemon-reload && systemctl restart docker.

Untuk informasi lebih lanjut, silakan melihat dokumentasi .

modulitos
sumber
Jika Anda mengikuti petunjuk pemasangan buruh pelabuhan saat ini untuk Debian, Anda mendapatkan skrip SysVinit tetapi tidak digunakan. Lihat github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside
4

Solusi yang lebih sederhana adalah membuat titik tautan lunak ke apa pun yang Anda inginkan, seperti

link -s /var/lib/docker /mnt/whatever

Ini bekerja untuk saya di server CentOS 6.5 saya.

liuyanghejerry
sumber
6
Jangan membuat softlink. Alasan melihat komentar saya yang saya kirim sebelumnya ... Anda mungkin mengalami masalah dengan perintah 'docker rm'!
suther
2
@suther: Mei? Sekarang adakah situasi yang Anda hadapi atau tidak? Mungkin agak tidak tepat untuk dokumentasi teknis, jika saya mengalami masalah maka saya ingin belajar kapan tepatnya itu terjadi, bagaimana masalah itu disebabkan dan bagaimana hasilnya.
hakre
4

Seperti yang disarankan oleh @mbarthelemy, ini dapat dilakukan melalui -g opsi ketika memulai daemon buruh pelabuhan secara langsung.

Namun, jika buruh pelabuhan sedang memulai sebagai layanan sistem, tidak disarankan untuk memodifikasi /etc/default/dockerfile. Ada pedoman untuk ini yang terletak di sini .

Pendekatan yang benar adalah membuat /etc/docker/daemon.jsonfile di sistem Linux (atau Mac) atau %programdata%\docker\config\daemon.jsondi Windows. Jika file ini tidak digunakan untuk hal lain, bidang berikut ini sudah cukup:

{
    "graph": "/docker/daemon_files"
}

Ini dengan asumsi lokasi baru tempat Anda ingin memiliki data tetap ada /docker/daemon_files

ivandov
sumber
2

Pada openSUSE Leap 42.1

$cat /etc/sysconfig/docker 
## Path           : System/Management
## Description    : Extra cli switches for docker daemon
## Type           : string
## Default        : ""
## ServiceRestart : docker
#
DOCKER_OPTS="-g /media/data/installed/docker"

Perhatikan bahwa DOCKER_OPTS pada awalnya kosong dan yang saya lakukan hanyalah menambahkan argumen untuk membuat buruh pelabuhan menggunakan direktori baru saya

Mahlatse Makalancheche
sumber
2

Pada Fedora 26 dan mungkin banyak versi lain, Anda mungkin mengalami kesalahan setelah memindahkan lokasi folder dasar Anda seperti dijelaskan di atas. Ini terutama benar jika Anda memindahkannya ke suatu tempat di bawah / rumah. Ini karena SeLinux menendang dan mencegah wadah buruh pelabuhan menjalankan banyak programnya dari bawah lokasi ini.

Solusi singkatnya adalah menghapus opsi --enable-selinux saat Anda menambahkan parameter -g.

Euan
sumber
Bukankah itu ruang terbuka untuk serangan?
yuriploc
1

Pada AWS Ubuntu 16.04 Server saya meletakkan gambar Docker pada EBS terpisah, dipasang di / home / ubuntu / kaggle /, di bawah dir docker

Cuplikan skrip inisialisasi saya ini berfungsi dengan benar

# where are the images initially stored?
sudo docker info | grep "Root Dir"
# ... not where I want them

# modify the configuration files to change to image location
# NOTE this generates an error
# WARNING: Usage of loopback devices is strongly discouraged for production use.
#          Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
# see /programming/31620825/
#     warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use

sudo sed -i   ' s@#DOCKER_OPTS=.*@DOCKER_OPTS="-g /home/ubuntu/kaggle/docker"@ '  /etc/default/docker

sudo chmod -R ugo+rw /lib/systemd/system/docker.service
sudo cp  /lib/systemd/system/docker.service /etc/systemd/system/
sudo chmod -R ugo+rw /etc/systemd/system/

sudo sed -i ' s@ExecStart.*@ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://@ '  /etc/systemd/system/docker.service
sudo sed -i '/ExecStart/a EnvironmentFile=-/etc/default/docker' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep "Root Dir"
# now they're where I want them
George Fisher
sumber
0

Untuk pengguna Mac dalam versi 17.06.0-ce-mac19, Anda cukup memindahkan lokasi Disk Image dari antarmuka pengguna dalam opsi preferensi. Ubah saja lokasi gambar disk dan itu akan berfungsi (dengan mengklik Pindahkan disk image ) dan restart buruh pelabuhan. Dengan menggunakan pendekatan ini saya dapat menggunakan hardisk eksternal saya untuk menyimpan gambar buruh pelabuhan.

sahu
sumber
bagaimana dengan file docker yang ada? haruskah kita memindahkannya secara manual?
gustav
Anda dapat mencoba menginstal ulang buruh pelabuhan di lokasi pilihan Anda. File gambar dan buruh pelabuhan independen.
sahu