 Спасибо вам, Моц. А Дима, что глядя? Я думаю, что у меня уже функция. Я думаю, что живет. Это мют или анмют. Так, если там то посолнешь, то у меня функция. Что видишь? Супер. Так, я ему жегну, как семенуешь за минуту. Да. Тейси, буду за ним. Здравствуйте. Здравствуйте. Привет, всем. Пожалуйста, добро пожаловать на наш следующий спикер. Томаш Томечек, подпишись, пожалуйста. Я Томаш. Я работаю на Редхед. И в прошлом год я работал на билдеи Дакра Эмиджи. Итак, начнем с вопросов. Кто уже построил, скажем, 100 Дакра Эмиджи сегодня? О, красиво. Окей, начнем с разговора. Так, тема, или название разговора, это тяжело построить Дакра Эмиджи? Так, я думаю, что это не очень тяжело, это просто написать в Дакра файл, который не очень тяжело. Потом вы просто работаете в Дакра Билде. И что может быть тяжело про это, правильно? Так, да, это был разговор. Спасибо. Кто-то у него вопросы? Окей, так, я... Да, я пойду. Окей, так, давайте сделаем вопрос немного тяжелее. Окей, так, это очень тяжелее. Давайте идем с этой вопросом. Так, тяжело построить Дакра Эмиджи в константином, в environе, которая постоянно меняется, и вы не можете контролировать. И каждый релиз Дакра может брать что-то, илиnew the code, и так далее. Ну, мой ответ для этой 질문 это что? То есть, так, это тема этой clauses. Так, это цена, и что я хочу сказать, я хочу показать проблемы с Дакра Эмиджи, и проверить, что это проблема, почему это проблема, и как вы можете другого ссорить. Мы покажем команды, если вы не знаете, какие стены вы получите. Мы тоже говорим об invalidating build cache, который может быть иногда реальной пейной. Мы также говорим о секретах, которые мы хотим использовать в build, но мы не хотим их быть exposed в final image. Но первая вещь, которую я расскажу, я расскажу, как строить. Потом мы говорим о images metadata. И, наконец, какой-то controversial topic будет об изменениях в Darker ecosystem. Так что, как я сказал, если вы интересны, я рада, если вы слушаете это, но если вы не, я думаю, это хорошо, чтобы вы стояли и ушли. Я не буду спрятаться, особенно, когда я делал выводы о том, что это очень мастерично, и я не сказал вам ничего о том, что это. Так что, спасибо. Окей, начнем. Окей, так что, как строить? Начнем с простой introduction в Darker ecosystem. В прошлом, когда кто-то сказал в Darker, это обычно означает контейнер-экосистем. То, что вы можете использовать в контейнерах, и вы можете разобраться в вашей аппликации. Но сейчас в Darker есть огромный экосистем. Это множественные проекты, они interact вместе, и они начнут быть довольно сложными. И сейчас, если кто-то сказал в Darker, для меня это просто означает компания. Но контейнер-экосистем в себе, то, что работает в вашей аппликеции и в вашей сервере, это просто единственная бинария. Так что в Darker есть единственная бинария. Она имеет 10 мегабитов. Она очень большая. И часть этой бинарии есть две компоненты, первая компонентка, контейнер-экосистем, и тренировка и берегает все контейнеры. И потом есть в Darker клиенте, который также в один из этих бинариях. И он пересчитает в ежене через API, который имеет HTTP API, вообще. Так что, бинария, это часть, которая берегает бинария. Она имеет ее своевые API-наполицы. Она есть в первом области, если вы интересы в этом. И в Darker клиенте, который тренировка и бинария который кто-то может ожидать, но, в принципе, это тар-стрим, то есть, когда ты делаешь дакр-билт locally, ты не хочешь сцепить его к дакр-файлу, ты хочешь сцепить его к директуре, и что клиент делает, то он будет создать архив для этого, и он сцепит его к дакр-файлу через конкульт. Это как-то... Так, да, дакр-билт. Так, это была интервью. Так, мы знаем, как мы можем создать дакр-билт, но мы еще не имеем дакр-файлы. Дакр-файл — это файл, и он сцепил инструкции, и эти инструкции есть аргументы. Какие-то инструкции — рам, команд, фронт, мейнтейнер, порт, волюн, и так далее. Так, ты будешь передать его к клиенту, клиент будет передать его к серверу, сервер будет процессовывать, и это всё. Так, мы знаем, как мы можем создать дакр-файлы. Если вы интересны о дакр-файлахе, я хотел бы сказать, что когда я увидел Хонзахарак's talk, что будет happen tomorrow, его названия — Developing Containers in Enterprise World — это очень круто. Мы знаем, как создать дакр-файлы. Быстрее. Так, здесь есть дакр-файл, он сцепил, и он сцепил. И так далее. И на левом стороне, вы можете видеть дакр-файлы. Я думаю, что вы уже видели это. Так, давайте посмотрим, что происходит в заднем боке. Так, здесь есть все те степи. Так, просто пройтем, и я пройтем к дакр-файлу, к предыдущей дакр-файлы, и я вам объясню. Это ли это флешт? Хорошо. Так, давайте перейдем. Мы перейдем к степе №1. В степе №0 это как-то сложно, степе №1 лучше. Так, первая вещь — дакр-файлы — когда начинается пройтем инструкции, то, что первая вещь — будет смотреть на дакр-файлы. Если он уже в дакр-файле, то будет взять имидор из дакр-файлы и идти дальше. То есть, будет видеть, если пиратная имидорка как в предыдущей дакр-файлы и если твой пиратный пиратный пиратный как в предыдущей дакр-файлы. Если они все одинаковые, то просто идите в другую. В этом случае, это также обморожение модифицирования файлы. Если это не изменится, то это будет из дакр-файлы. Тогда вы можете видеть, что он будет взять предыдущую имидорку из предыдущей дакр-файлы, которая была федера 23. Это будет взять имидорку. Это будет создать контейнер из дакр-файлы. Это будет применять изменение. В этом случае изменение — это будет копить файл... О, Sorry about that, I have two big fingers. Yeah, I'm lost. I can tell Pomelo to the root folder, then it will commit the container, which means that it will create an image from container. It will save it to cache, and that's pretty much it. That's how the steps work. So the next step is very similar. Look into the cache, it's not their createContainer, applyChange, createImage, done. And we have our image. You can also see that it's removing the containers. Так что это контейнер, который используется для процесса, и он не нужен, так что он убежит. Вы можете, конечно, манипулировать это, так что вы можете рассказать Даккер, чтобы оставить все контейнеры и так далее. Так что это очень просто, и если вы посмотрите на это, вы можете это сделать с клиентом. Вы не нужны, чтобы все было сделано по API endpoint. Вы можете заполнить комментарии с Даккером, вы можете копить файлы с Даккером, и вы можете создать имидоры из контейнера с Даккером и change. Change, в принципе, это из-за участия, от доктора файлы и аргументы. Так что вы можете, наверное, все это сделано с клиентом, вы не нужны для этого сервера. И это, в принципе, что Даккер пытается делать сейчас. Они пытаются получить билдер с демоном и двигать его к клиенту, или, может быть, создать новую клиенту. Так что, да, это current movement. И еще один важный вещь, я бы хотел сказать, который мы поговорим больше о том, что лейтинг. Так что, давайте вернемся. Так что лейтинг. Даккер использует копийный файл-систем для всех контейнеров. Так что, эта инструкция создает новая лейта. Так что, да, это действительно... Давайте предполагаем, это одна лейтинка, это еще одна лейтинка, и это еще одна лейтинка. И это означает, что когда Даккер создает контейнеры, он будет взять все эти лейтинги и приложить все их, как пейнкейк, так как ты взял бейс-имидж, вот это один пейнкейк, следующая лейтинга копийная, еще один пейнкейк, и это как твой контейнер, в конце. Так что, например, в этом случае эта лея будет у нас в федера 23 эмитча. Эта лея будет у нас только один файл, и эта лея будет довольно empty, потому что нет файл-система. Это мета.change. Окей, это всё. Окей, então давайте начнем с каких-то проблем. Первым проблемом есть, что у нас есть эти лея, и есть много их, и мы хотим их сквозить. Мы не хотим, например, 10 лея, мы хотим только 2 или 3. И это то, что происходит. Сквозить лея из-за многих леев, чтобы создать один. Окей, почему? Почему я хочу сделать это? Есть несколько вопросов. Потому что все эти лея são новыми файл-системами. И если у них много леев, они будут взять много места, и это будет время, чтобы создать финальный контейнер из всех этих леев. Если у вас есть контейнер с, я не знаю, 1000 леев, это будет взять секунды, чтобы даже начать. И это не то, что вы хотите. Вы хотите начать контейнер как soon as possible. Так что, да, реформация, это главный момент. Другий момент, это же имя. В данном случае, лея работают, если вы уберите файлы в лея, файлы будут быть еще там, на вашем диске, живут в там, всегда, всегда. И если вы поняли, что файлы, которые были уберены в один из них, они будут еще в какой-то лея. Так что, например, если я пытаюсь сделать, в этой лея, чтобы убереть файлы по мэллоу, это будет еще в финале, но что Даккер делает, это будет просто сказать, что, окей, в финальный контейнер, уберите этот файл, но он еще там. Так что, да, и в данном случае, это называется лея, просто для реформации, если вы видели это имя, это про уберите файлы из лея. Окей, так что, что есть soluции? Есть несколько. Первое, чтобы оптимизировать Даккер файлы, чтобы убереть все инструкции, чтобы быть в один из них. Например, если вы меняете металлит, как-то environmentally variables, у меня есть один лея, а не в multiples. То же самое можно делать, чтобы убереть все инструкции, а не в multiples. Первое, что вы можете делать, это вы можете делать Даккер экспорт и Даккер импорт, это значит, что он будет убереть вашу имя в один лея, и он будет убереть это в Даккер, который очень нужен, у него есть только один лея, но проблема с этим, если вы хотите поделиться этим имемтом со всем миром, они должны убереть все инструкции, так как вы не можете изменить предыдущие кишки. Например, если я обморожил мою иммунику, которую я уже показал, и некоторые из них хотят убереть это, то он тоже будет убереть федеробейсовую иммунику, даже если это будет уже на его компьютере. Так что, я думаю, что это очень хорошо, если вы хотите поделиться иммунику, уберите ее и уберите ее, но чтобы поделиться с другими людьми, это не очень практикально. И next thing you can do is you can use some custom tooling to squash the layers. Excuse me. So right now there are two possible solutions, which I was able to find. So the first one is called it's created by Mario Goldmann from Red Hat, and we are actually using it in production, so if you have some layered image from Red Hat, the layers are being squashed by this tool, so yeah, it's working, it's really great. There is another tool called Darker Squash, which is written by community, and the thing is that if you open the GitHub page of the tool and look into issue tracker, and it almost looks like it's not being maintained anymore or the guy doesn't have enough time to work on it, so yeah, I totally recommend Darker Scripts. So is anyone interesting to know how these things work? I can talk about it. Okay. Okay. Okay, so the way this works is that you have two commands within Darker, Darker Save and Darker Load. With Darker Save, you can take the image from Darker and save it on your laptop as a one archive, and this archive contains all the layering. So what you can do is that you can Darker Save, you have all the layers, you will squash them, so you merge the rootFS of all the layers, you will merge the metadata, then you will create the exact like the same structure of the archive and you do Darker Load and get it back into the Darker Engine, then you squash the layers. Okay, not easily. Okay, so that's all to squashing. If you are interested to know more, these issues are all related to squashing. And for example, if you can see, here is issue number 300, which means like two years old and it's still not being fixed. So squashing with Darker is still not possible. There are also some pull requests, but they are not working. So, okay, let's move to another problem. And that is invalidating Build Cache. Yeah, this is a simple one, so I don't want to do all the hard stuff in the beginning. Okay, invalidating Build Cache. That's pretty much a simple problem. So you have Build Cache, it's really great when you want to develop an image or a Darker file, so it saves you a lot of time. Sometimes it takes stuff from cache you don't want it to. For example, these commands. I think that usually you want to run these commands all the time or pretty much. So my point is that they change over time. So if I right now do dnf install htpd, it will install version of htpd. If I do it in a minute later, it's pretty much the same. If I do it in one year later, it will probably be a very different package. And I don't want it to load from cache. I want to actually install the image again. And same goes for git clone. Okay, so how to solve this? Couple of questions. I mean couple of answers. So what I usually do, I prepend a new instruction in front of the instruction. I don't want to cache and do some environment. I want to do some environment and then I increment it every time I want to invalidate the cache. You can also append after a command something like this and do another two pipes every time I want to invalidate the cache. But I don't recommend because this actually means that if this command fails, the whole build won't fail even though I put it here. The point of this is that if you are trying to develop an image, I strongly suggest to run it with no cache if you are struggling with cache because the cache is just to improve the build time, nothing else. I guess that you want to debug your image and not the build cache. So please run it with no cache if there is something odd going on. Possible RFP How to solve this if you put in your Dockerfile I have this command and I would like to invalidate it after 1 hour, 10 minutes, 1 year. That would be a pretty good solution. Also, you could say that never cache this layer or always cache this layer. You can do that, but for the whole Dockerfile, not for each instruction. If you want to know more why this is still not in Docker there is an issue where is the discussion. It's of course closed. OK, next problem build secrets. This is a hard one again. I need to drink before it. So build secrets. This has been discussed for like 2 years and it's still not possible to be done. OK, so what is this about? It's about that during build you often want to authenticate with something. So when you want to authenticate you want to authenticate by a password and public SSH key or something like that and you don't want those to leak in final image. You don't want your customers to know your private SSH keys, passwords to your whole infrastructure, your bank account and treasure maps and something like that. So what I am precisely talking about is something like this in your images and you share them with the world I would like to if you could talk to me I will help you debug it after I hack your computer because this means as I already said that this will stay in the layer forever and it will never go away. So it might happen that in final image the file is not there but it's still in the layer. So the private SSH key is still there. So why? Do you hear anyone who would like to explain why you don't want to share your secrets with the world? I guess not. That's great. So how to solve this? As I said it doesn't have the best solution so there are just workarounds and kind of stuff. What we are actually using is squashing because if you squash those layers the files never been there actually so yeah that's really great solution. Another solution I found on the internet is that you can do built in two steps so if during built you want to fetch your application from internet and you need to authenticate you can do that in one step and in seconds in one docker file and you can write another docker file which will actually install the application but this is definitely not for everyone because you might want to authenticate with some service if you want to install for example like packaging like package manager. Another solution I thought it was a solution was built arguments which was added to docker 1.9 but earlier so the thing is that you can pass some variables to docker build which docker actually set as environment variables which are built and they will not leak into the metadata which is okay but they will actually leak in history because the layer will have in its command the whole content of the environment variables so yeah not the solution sorry. Another real solution is that you can fetch the secrets within one run instruction so you can do like curl and use it to clone the repo and then remove it within one layer so it won't be in the final image. For me the best solution to this problem would be if we could mount some volumes during build because that way I could put my key in the host then run the build and bind mount the key inside use it and the final image would not have the key but docker says that they don't want mounting volumes during build because I don't know okay so if you'd like to know more I strongly suggest to read the first one because it explains the issue in great detail, provides more solutions and it's like a good read okay let's go to the next problem this can only add what does it mean so when you are writing your docker files usually try to expose some ports some variables, labels and that kind of stuff so which means that you do like expose one, two, three, four okay so you have image which has export this port then you can do another image which uses base image as the first one but this means that the port will be still exposed so if in the next image you don't want to expose the port there is nothing you can do about it you can only add new metadata to images, you can't remove them in any way yeah and that's what this is about why so yeah your image can contain some metadata you don't want and there is no way you can like remove them or is it just I was showing you in the squashing part can export it, change the JSON manually then import it again and it won't be there yeah it's a solution but it's like a real hack you can also rebuild or take the docker file from the base image rebuild it yourself, remove the instructions you don't want and you can use this newly built base image like this solution but yeah okay blank the metadata so for example if there is some environment variable with some really with some weird value you can set it to zero or like empty string yeah that's also a solution the reason I'm talking about is that you might do some base image which has some labels set which you don't want or you don't even understand and you want to remove them so you can't basically you can set them as empty but that's it yeah there are no more information because I couldn't find an issue for it but there definitely is one if we are still in the metadata space so yeah let's talk about having more metadata about images so what's the problem for me the problem is that okay I find some really nice image on the internet and I want to use it so I do docker pool this image yeah it's really fine how do I run it what's inside is the content trustable are there some CVs is there some like that and for me that's really an issue so the only thing I can do is just go to the internet and look for the image how to use it, what's inside look at the docker file and see if I can actually use it yeah for us guys who are working in Linux we usually do like I don't know system control help so to see what I can do with system control or I can look at my page to check how to run the command what it supports and that kind of stuff and you don't have this with docker images there are just some blubs sitting on the internet and you can pull them and you have no idea what's inside, how to use it, how to run it and that kind of stuff so what we are trying to do within Project Atomic we have a set of labels which we try to apply to all images we produce the spec is in this URL so you can go and take a look and this set of labels is trying to like set some standard of what's inside the image so you can see like what's the original registry where the image comes from what's inside there's some simple description there's also versioning stuff so you know that this image is in version 1 and the release is 0 and there is another image with release 10 so I know that's actually an update so yeah Павелорай Скуб wrote a very nice image for PostgreSQL and he's using a framework for describing the image so when you run this image in here it will like first it will download from internet and then it will tell you okay so this image contains this and you can configure it like this and it has these options and so it actually has the thrilled to have like a standard within Docker ecosystem so all the images would have some like this okay let's go to the next problem and that's evolution and that's the most most controversial thing so as I was working for past year with Docker with building images and that kind of stuff the thing we did most I mean the most intrusive thing for us was that Docker was changing so rapidly it was changing with every release we had to like fix a lot of bugs when the new release came we had to work around stuff okay we are work around stuff still and yeah so the thing is that Docker is still so young it's just 3 years old they had some bad decisions in the beginning and then they are trying to fix this now breaking compatibility there's lots of deprecated stuff and that kind of and you really need to deal with this so if you are trying to run Docker in production you need to be agile you need to with every release you need to check what's new how to fix it if you can use the new feature if it's usable if so how to use it and if there is some stuff deprecated you need to start working on new code to basically remove the feature so yeah this is getting pretty complicated so if I can talk about it more thoroughly so what changed so for example specifications changed there was a change in registry API there was a v1 API and now there is v2 which has completely new specs so if you are using this the old one are just gone and the new one is still changing actually with .10 which was released today there is a new change in the spec networking so for example in past you had just one bridge interface and right now you can configure the whole networking stack there is also a DNS server running in your Docker engine right now or with the .10 release which is like super controversial there was a backend rewrite so if you were trying to access Docker in past and you want to do it today with new release there was a big change in there so it will probably break your tools ok so there are also breaks in performance for example in 1.9 there was a there was a change with Docker PS so with 1.9 it was it was slowed down really badly so they had to fix it in 1.191 there are also breaks in API but there are just bugs which are fixed usually about removing for example is there anyone who was using Docker images 3 3 I was really great feature and they just removed it and there is a huge issue for this and there are people crying to get it back I guess the Docker will never bring it back but luckily there is an external tool with exactly the same functionality so you can still use it ok I was ranting too much ok so why the slide is blank because I think that the changes are needed I mean the ecosystem is still young and needs to change needs to improve some of their changes are good some of them are bad well actually we can we can send patches and stuff like that but they usually don't get accepted ok what can you do about it so you can use as few features as you possibly can but I don't know if that's a good solution I strongly suggest to follow upstream check their mailing list what they are up to, what they are working on and start preparing like your infrastructure for a next new Docker release 4Docker this is what we are doing we have upstream Docker and we have a set of patches with upstream Docker and they are all described in our kit repo so you can read why we have these patches why Docker didn't accept them and it's all written there ok so here are some links to this topic mostly they are like what was Docker breaking and how they needed to fix it ok so we are about we are closing so it was the summary of my talk I guess that I was ranting too much but that was not my point my point is that for me Docker is a really great technology I'm using it daily for me it sells real problems but it's really young still young after 3 years and you really need to pay attention what's changing and how to use the new stuff so let's get back to my first question which was is it hard to build a Docker image so what do you think is it hard because for me it is ok so this is my last slide so I'm too much to my check I'm working for Red Hat I'm working on building images so if you'd like to get in touch with me and say hello and I'm glad to talk to you if you'd like to connect with me I'm using twitter and google plus so feel free to add me and talk to me and if you have any questions I'd be really glad to yes please ok so the question was how do we test images so yeah I'm working on the engineering part where I developed the way that it depends on the images and checks if they contain like signed RPM packages if they contain all the labels and this is hooked into a CI so yeah we test everything well the thing is that the test suite is really specific for Red Hat so I don't think it would make sense to open source it sorry I'm not working on the QE so I don't know yes please it's pretty simplistic usually you want to have different kind of builds as you said the two step things that you mentioned before building your build image generating a stream of a star stream reusing that one image for example for a developer the other one developer tooling which usually never is there something because it's just like to be superficial what you find ok so the question was if I can show some more resources how to build images and that kind of stuff so first thing I would suggest go to the links I was showing well for me the best resource for learning about Docker to go through issue tracker and the folks they are writing to issue tracker there are real people who are using Docker who are sharing their issues and more people are actually trying to help them so that's why I educate myself I also read a lot of blogs which you can find randomly on the internet and I was actually getting to it so yeah and within Red Hat we have a lot of resources how we are building images so if you get in touch with me after the presentation it can definitely give you more links thanks Denise ok so any more questions yes so you haven't used it ok so the question is about Docker images 3 so the reason I liked it was that if you look at your at all your images they are basically like Lego or like pancakes as I was saying so if you look at it they are making it like a graph so you have like a tree you have one image which is based for all of them then you have like base images like Fedora, Rails, CentOS and then you have your application images and they created three so the command was actually showing you the whole tree of all your images on your now so it was like some like ps3 of your processes but this one is for images and it was really great to see like 10 images getting from Fedora and have 20 images from CentOS and yeah if you I can show you the tool which does that now and you can try it on your laptop yes well it's already being in place for a couple of like pretty long yeah I like it so we and it's not like redhead specific you can use it like within your company it's just a set of set of labels we want to have on all our images to better identify them so there's like the description and releasing stuff and where the image is coming from and this kind of stuff so I really like it I mean it's great so if you look yeah exactly well to be honest Rocket guys were collaborating on them with us so everyone can use it so any more interesting questions do we have time? okay 2 questions or 2 minutes 2 minutes okay I guess not so I'm glad you attended my talk and I hope it was you yes sorry I'm blind so yes or no okay so thank you for attending my talk it was useful for you and your rest of the conference okay I'm glad that it's finally behind me that I don't have to stress thank you okay so I have a really bad memory and I'm still speaking to them that's what I'm missing I want to get back into the old school I don't know this stuff only because of that I think you don't have to speak in that so yeah I can definitely understand it so if you tweeted aha just so I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I